다른 블럭에 함수를 정의하고 사용하여 값을 주고 받을 때, C에서는 기본적으로 지역 변수로 선언된 변수의 값은 서로 다른 블럭에서 사용할 수 없기때문에 기대한 결과값과 실제 결과값이 다르게 나올 수 있습니다. 이런 상황을 위해 매개변수 간 자료 전달 방법에 대해 알 필요가 있습니다.
'call by value(값에 의한 호출)'는 함수를 호출하여 인자를 매개변수로 넘겨줄 때 값을 복사하여 넘겨줍니다.
#include <stdio.h>
void swap(int x, int y);
int main(){
int x = 1, y = 2;
printf("원래 값\n");
printf("x = %d, y = %d\n", x, y);
swap(x, y);
printf("\n");
printf("바꾼 값\n");
printf("x = %d, y = %d\n", x, y);
}
//매개변수로 받은 두 값을 서로 교환
void swap(int x, int y){
int tmp;
tmp = x;
x = y;
y = tmp;
}
원래 값
x = 1, y = 2
바꾼 값
x = 1, y = 2
swap() 함수는 매개변수로 받은 두 인자 값을 서로 교환할 목적으로 작성했지만 실행 결과는 교환이 되지 않은 것을 확인할 수 있습니다.
C에서 기본으로 사용되는 이 방식은 복사하여 인자를 넘겨주면 서로 별개의 변수가 되므로, 넘겨주는 순간 더이상 관련이 없어지기때문입니다.
물론 swap() 함수의 반환 자료형을 void가 아닌 int로 바꿔 return문을 이용하면 값의 반환이 가능하지만, 하나의 값 밖에 반환할 수 없기때문에 사실상 불가능합니다.
'call by reference(참조에 의한 호출)'는 함수를 호출하여 인자의 주소값을 매개변수로 넘겨줍니다.
정확히 얘기하자면 C에서는 공식적으로 call by reference를 지원하지않는다고합니다. 따라서 이 예시의 방법은 주소값을 복사하여 넘겨주므로 call by reference가 아닌 'call by address'로 보는 것이 맞다고 합니다.
#include <stdio.h>
void swap(int *x, int *y);
int main(){
int x = 1, y = 2;
printf("원래 값\n");
printf("x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("\n");
printf("바꾼 값\n");
printf("x = %d, y = %d\n", x, y);
}
//매개변수로 받은 두 값을 서로 교환
void swap(int *x, int *y){
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
원래 값
x = 1, y = 2
바꾼 값
x = 2, y = 1
자료 값이 아닌 인자의 주소값을 (복사하여) 넘겨주었습니다. 따라서 swap() 함수에서도 기억공간의 주소에 접근함으로써 해당 주소에있는 자료값을 얻을 수 있으므로, 포인터를 사용하여 두 기억공간에 있는 자료값을 서로 교환해주었습니다.