언어/C언어_기초

39강 | 함수에 주소전달(1)

hyehh 2024. 2. 26. 08:18
728x90
반응형
SMALL
728x90
반응형
SMALL

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이 출력된다.


 

 

728x90
반응형
LIST