Call by Value, Call by Reference.

parrier의 이미지

Call by value의 경우에는 인자값을 복사해 가서 사용하므로, 함수가 리턴된 이후에는 수정된 해당 값이 적용되지 않으며,

Call by reference의 경우에는, 주소값을 받아와서 처리하므로 수정된 결과 하나하나가 다 기록된다...

라고 배웠는데요.

Call by reference는 꼭 & 기호를 붙여주어야만 함수가 인식하는 것인가요?(일종의 룰인 것인지?)

인자값으로 넘기는 것을 &을 붙이지 않고 그냥 넘겼는데, 해당 변수가 포인터 변수였다면, 굳이 &를 붙이기 위해서 &(*abc)라고

해줄 필요가 없을 것 같은데요. 함수 포인터의 주소값 조차도 복사를 하기 때문에 실제 Call by reference를 하려면

&를 꼭 붙여주어야 하는 것인가요?

라스코니의 이미지

&A 가 주소값을 넘겨주는 것이고,
A 는 값을 넘겨주는 것이기 때문에 그렇습니다.

& 연산자에 대해서 찾아 보세요.

parrier의 이미지

헷깔리는 것은, 컴파일러 수준에서 함수에 포인터 값을 넣었을 때 이것을 주소값으로 인식할 수는 없는
것인지를 잘 모르겠습니다. 결과적으로는 함수 포인터 값이 주소를 가리킨다 하더라도, 함수의 인자값으로
쓰일때는 하나의 값일 뿐이므로 &연산자가 붙지 않은 것은 Call by Value가 발생한다...
라고 임의 추측을 했습니다만, 정확히 이것이 맞는 것인지 모르겠습니다.

제가 이전에 있었던 상황을 정확히 이해를 못하고 넘어갔더니 지금까지도 머리를 싸매게 하네요^^;
지금 다시 짜봤는데 포인터는 포인터 그대로 기억을 하는 것 같은데.. 아마도 이, 삼중 포인터를 쓰면서
문제가 생겼던 것 같은데 조금 더 생각해봐야할 것 같네요. 답변 감사합니다.^^

-_-v

klara의 이미지

엄밀하게말하면, C는 모든 인자가 call by value입니다.
포인터를 넘기면 포인터의 값이 복사되고, 받는 쪽에서는 그 주소값으로 원래의 변수를 참조합니다.

라스코니의 이미지

아. 예. 맞습니다.
기본적으로 C 는 call-by-value 입니다. 단지 값을 넘겨줄 때, 변수값을 넘겨주느냐 변수 주소값을 넘겨주느냐의 차이가 있을 뿐입니다.

받는 쪽에서 주소값을 받게 되어 있다면 컴파일러는 자동으로 값을 넘겨주는 함수의 parameter 가 주소값에 해당하는 것인지 검사하게 됩니다.

만약 void func(int *a, void (*xxx)()); 라고 받는 함수의 원형이 정의되어 있다면

아래와 같은 호출은 모두 정당한 것입니다.

int a;
int *b;
void example();
void (*pt2example)() = &example;

func(&a, example);
func(b, *pt2example);
func((int *)0x39489583, void (*)()0x2939493);

사용자가 원형에 맞게 호출만 한다면 컴파일러는 불평하지 않을 겁니다.

그렇지 않다면 컴파일러는 약속에 맞지 않게 호출되었다고 하겠죠.

boy0226의 이미지

해당 변수가 포인터 변수였다면, 굳이 &를 붙이기 위해서 &(*abc)
-> 그냥 abc 라고 쓰셔도 무방합니다.

abc가 포인터 변수니까 abc라고 주변 포인터를 넘겨주어 call by reference 가 되죠..

call by value : 말그대로 값을 넘겨주는 것
call by reference : 말 그대로 참조를 넘겨 주는것 (참조라 하면 주소값)

화이팅~~

에라이디여~ 초급 산을 넘어라~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.