Call by Value, Call by Reference.
글쓴이: parrier / 작성시간: 화, 2008/12/30 - 9:41오전
Call by value의 경우에는 인자값을 복사해 가서 사용하므로, 함수가 리턴된 이후에는 수정된 해당 값이 적용되지 않으며,
Call by reference의 경우에는, 주소값을 받아와서 처리하므로 수정된 결과 하나하나가 다 기록된다...
라고 배웠는데요.
Call by reference는 꼭 & 기호를 붙여주어야만 함수가 인식하는 것인가요?(일종의 룰인 것인지?)
인자값으로 넘기는 것을 &을 붙이지 않고 그냥 넘겼는데, 해당 변수가 포인터 변수였다면, 굳이 &를 붙이기 위해서 &(*abc)라고
해줄 필요가 없을 것 같은데요. 함수 포인터의 주소값 조차도 복사를 하기 때문에 실제 Call by reference를 하려면
&를 꼭 붙여주어야 하는 것인가요?
Forums:
&A 가 주소값을
&A 가 주소값을 넘겨주는 것이고,
A 는 값을 넘겨주는 것이기 때문에 그렇습니다.
& 연산자에 대해서 찾아 보세요.
& 연산자의 의미는 이해했습니다만 ;.;
헷깔리는 것은, 컴파일러 수준에서 함수에 포인터 값을 넣었을 때 이것을 주소값으로 인식할 수는 없는
것인지를 잘 모르겠습니다. 결과적으로는 함수 포인터 값이 주소를 가리킨다 하더라도, 함수의 인자값으로
쓰일때는 하나의 값일 뿐이므로 &연산자가 붙지 않은 것은 Call by Value가 발생한다...
라고 임의 추측을 했습니다만, 정확히 이것이 맞는 것인지 모르겠습니다.
제가 이전에 있었던 상황을 정확히 이해를 못하고 넘어갔더니 지금까지도 머리를 싸매게 하네요^^;
지금 다시 짜봤는데 포인터는 포인터 그대로 기억을 하는 것 같은데.. 아마도 이, 삼중 포인터를 쓰면서
문제가 생겼던 것 같은데 조금 더 생각해봐야할 것 같네요. 답변 감사합니다.^^
-_-v
엄밀하게말하면, C는
엄밀하게말하면, C는 모든 인자가 call by value입니다.
포인터를 넘기면 포인터의 값이 복사되고, 받는 쪽에서는 그 주소값으로 원래의 변수를 참조합니다.
아. 예. 기본적으로 C
아. 예. 맞습니다.
기본적으로 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);
사용자가 원형에 맞게 호출만 한다면 컴파일러는 불평하지 않을 겁니다.
그렇지 않다면 컴파일러는 약속에 맞지 않게 호출되었다고 하겠죠.
해당 변수가 포인터
해당 변수가 포인터 변수였다면, 굳이 &를 붙이기 위해서 &(*abc)
-> 그냥 abc 라고 쓰셔도 무방합니다.
abc가 포인터 변수니까 abc라고 주변 포인터를 넘겨주어 call by reference 가 되죠..
call by value : 말그대로 값을 넘겨주는 것
call by reference : 말 그대로 참조를 넘겨 주는것 (참조라 하면 주소값)
화이팅~~
에라이디여~ 초급 산을 넘어라~
댓글 달기