본문 바로가기

전자 공학/C언어 C++

[C언어 독학하기] 17. 값에 의한 호출, 주소에 의한 호출

반응형

 

 

 

안녕하세요. 취업한 공대누나입니다.

오늘은 함수의 호출 방식중 

값에 의한 호출과 주소에 의한 호출에 대해 공부해보도록 하겠습니다.

 

1. 값에 의한 호출 (call by value)

 

이전 '함수'편에서 공부했던 방식은 값에 의한 호출입니다.

2020/11/03 - [전자 공학/C언어] - [C언어 독학하기] 13. 함수

 

[C언어 독학하기] 13. 함수

안녕하세요. 취업한 공대누나입니다. 오늘은 함수에 대해 공부해보도록 하겠습니다. 저는 처음에 함수에 대한 개념을 잘 이해하지 못했었는데요. 이제는 나름? 자유자재로 사용할 수 있게 되었

gdnn.tistory.com

 

값에 의한 호출 방식은 변수의 값을 복사해서 함수를 호출하는 방식을 말합니다.

예시를 들어보겠습니다.

 

위와 같은 소스 코드에서 변수 a의 값을 i에 복사하는 것입니다.

변수 i와 변수 a는 다른 메모리 공간을 갖게 됩니다.

그리고 함수가 종료되면 변수 i의 메모리 공간 또한 사라집니다.

왜냐하면 변수 i는 이 함수의 매개 변수/ 지역 변수이기 때문입니다.

 

결론적으로 변수 a와 변수 i는 서로 다른 메모리의 공간을 가지며 

변수 a의 값에는 아무런 변화가 없습니다.

 

 

2. 주소에 의한 호출 (call by reference)

 

값에 의한 호출과 다르게 주소에 의한 호출은 주소를 참조해서 함수를 호출하는 것입니다.

 

소스 코드가 조금 달라진 것을 확인할 수 있습니다.

add(&a)를 보시면 변수 a의 주소로 add함수를 호출한 것을 볼 수 있습니다.

이렇게 되면 변수 i에 &a가 저장이 됩니다.

그래서 *i는 *&a의 의미와 같습니다.

따라서 *i + *i가 a+a와 같아지는 것입니다.

 

마찬가지로 함수가 종료되면 변수 i의 메모리 공간은 사라지게 됩니다.

 

그렇다면 주소에 의한 호출은 왜 필요한 것일까요?

가장 대표적인 예인 swap 함수를 이용해서 설명을 해보도록 하겠습니다.

 

먼저 값에 의한 호출에 의해서 swap을 해 본 것입니다.

결과창만 보더라도 a와 b값이 바뀌지 않은 것을 알 수 있습니다.

이유가 무엇일까요?

 

함수 내부의 지역 변수인 num1과 num2는 값을 전달 받아서

1,2에서 -> 2,1로 잘 바뀌었습니다.

하지만 num1과 num2만 바뀐 상황에서 함수가 종료되면서 공간이 사라지게 됩니다.

따라서 a와 b의 값은 건드리지 않게 되는 것입니다.

 

하지만 주소에 의해 호출하면 어떻게 될까요?

 

swap이 제대로 된 것을 확인할 수 있습니다.

swap 함수가 호출이 되면 swap함수의 num1과 num2에 a와 b의 주소값이 각각 전달되어

a와 b의 공간을 가리키게 됩니다.

swap함수에 주소값을 넘겨주어 주소 안의 값을 변경하였기 때문에,

함수가 사라져서 변수의 공간이 사라지게 되더라도 main함수의 a와 b의 값을 바꾸었으므로

a와 b는 서로 교환되는 것입니다.

 

 

당시에는 시험 공부만 급급하여 대충 외우고 넘어갔던 부분들인데

천천히 다시 공부해보니 크게 어려운 부분이 아니네요.

그 떄 왜 제대로 공부하지 않았을까 후회됩니다.

반응형