코드 5-8과 코드 5-6을 비교해 보면 함수 인자 목록에서 int x가 int *x로 바뀌었고(#1), x = value;가 *x = value;로 바뀌었습니다(#2). * 연산자가 추가되었습니다.
또한 change_value(x, 20)이 change_value(&x, 20)으로 바뀌었습니다(#4). x 앞에 & 연산자가 추가되었습니다. *와 & 연산자가 각각 무슨 일을 하는지 알아보기 전에 실행 결과를 확인해 볼까요? 이전 절에서는 main() 함수 안의 지역 변수 x 값이 바뀌지 않았는데 이번에는 바뀐 것을 알 수 있습니다.
int *는 int형 포인터를 의미합니다(#1). 이 책은 C/C++ 문법 책이 아니므로 자세한 설명은 생략하고 의미만 그림으로 간단히 살펴보겠습니다. 그림 5-6은 change_value() 함수를 호출했을 때(#4) *x = value가 실행되기(#2) 직전에 본 스택 프레임 모습입니다.
그림 5-6 change_value 스택 프레임 ① (call by reference)
#4에서 &x로 인자를 전달합니다. 이는 main() 함수 스택 프레임의 변수 x가 위치한 메모리 공간의 첫 번째 바이트 주소 값을 전달한다는 의미입니다. 즉, 값 10을 전달하는 게 아니라 데이터 10을 저장하고 있는 4바이트 공간(int형은 정수형 자료형으로 4바이트를 차지합니다) 중 첫 번째 바이트의 주소 값을 전달합니다.