39강 | 함수에 주소전달(1)
39강 | 함수에 주소전달(1)
자료 출처 - 깨알 C언어 | 39. 함수에 주소전달 (1) (youtube.com)
주소를 전달하겠다.라는 것은
포인터를 전달하겠다. 라는 것이다.
주소를 전달하는것과 값을 전달하는 게 있다.
call by value
함수를 호출할때 value 값 만을 호출하겠다.라는 것이다.
call by Reference
주소값을 전달하겠다 또는 객체를 전달하겠다, 오브젝트를 전달하겠다, 배열을 전달하겠다.
int x=10, y=20;
main에서 x에는 10이 있고, y에는 20이 있다.
f라는 함수를 호출하는데, 그 안에서 인자값으로 x의 주소값을 전달한다.
x의 주소값을 100번지라고 하고, y를 200번지라고 하면 100번지가 전달된다.
y는 call by value이다. 20값을 전달한다.
제어권이 f로 넘어간다.
*i이니깐 주소값을 가진 i라는 포인터 변수이다. 이것은 100번지를 갖게 된다.
j는 20을 갖게 된다.
*i +=5;
풀어쓰면 *i= *i+5이다. i의 값이다. i가 가리키고 있는 것은 100번지이고, 100번지의 값은 10이다.
10+5=15가 된다. 15를 i의 값에다가 집어넣는다. x에는 15가 들어가게 된다.
메모리의 주소값을 넘겼고, 그 주소의 값이라고 했으니깐 그 주소로 찾아 간다음에 그 공간에 집어넣어야 된다.
return ( 2 * *i + ++j);
리턴, 나를 호출한 곳에다가 값을 돌려준다.
++가 앞에 있으면 전위연산자이다. 그러면 우선순위가 이 중에서 가장 높으므로 먼저 해줘야 된다. 그러면 j는 21이 된다.
그다음으로 우선순위가 높은 것은 곱하기 연산이다. 2 곱하기 *i 이므로 i의 값인 100번지의 공간 15를 2곱해준다. 그러면 30이라는 값이 나온다 30+21=51이라는 값을 리턴 시켜준다.
printf("%d", f(&x,y));
리턴된 51 출력, 그리고 f는 제어권을 넘겼으니 이 안에서의 모든 지역 변수들은 싹 폐기된다.
printf("%d %d\n", x,y);
15와 20이 출력된다.