함수의 호출 방법에는 Call by Value (값에 의한 호출)와 Call by Reference (참조에 의한 호출) 2가지 방식이 있다.
1. Call by Value
값에 의한 호출로 함수의 매개 변수에 내용물을 전달하여 복사해 사용하는 방식이다.
백문이 불여일견이기에 실습을 통해 위 내용을 확인해보겠다.
#include <stdio.h>
void swap(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main(void)
{
int a = 100, b = 200;
printf("swap을 호출하기 전 : a = %d, b = %d\n", a, b);
swap(a,b);
printf("swap을 호출한 후 : a = %d, b = %d\n", a, b);
return 0;
}
실행결과 호출하기 전과 후 a, b의 값은 변하지 않고 그대로 출력되었다.
그 이유는 main 함수 안에 있는 a, b 변수를 매개변수로 직접 보낸 것이 아닌 함수에서 복사하여 사용했기 때문에 실제 main 함수 안에 a, b의 값은 변하지 않은 것이다.
2. Call by Reference
주소에 의한 호출로 주소를 참조해서 호출하는 방식이다.
이것 또한 위의 코드를 수정해서 실습해보겠다.
#include <stdio.h>
void swap(int *px, int *py)
{
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
int main(void)
{
int a = 100, b = 200;
printf("swap을 호출하기 전 : a = %d, b = %d\n", a, b);
swap(&a,&b);
printf("swap을 호출한 후 : a = %d, b = %d\n", a, b);
return 0;
}
실행결과 호출하기 전과 후 a, b의 값은 성공적으로 변했다.
그 이유는 swap 함수에 a, b의 주소를 전달하고 수정을 했기 때문에 main 함수 안에 있는 a, b의 값이 변한 것이다. 즉, 특정한 변수를 가리키는 포인터가 함수의 매개변수로 전달되면 그 포인터를 이용하여 함수 안에서 외부 변수의 값을 변경할 수 있다.