본문 바로가기

C언어

[C언어] call by value와 call by reference

함수에 매개변수로 값을 넘겨주는 방식에는 두 가지가 있다. 

 

1. call by value(값에 의한 호출): 매개변수를 통해 값만 넘겨준다. 즉, 원본 값을 복사한 복사 값만 넘겨준다.

2. call by reference(참조에 의한 호출): 매개변수를 통해 주소값을 넘겨준다. 즉, 원본 자체를 넘겨준다. 

 

두 변수 a, b의 값을 바꾸는 swap함수로 이해해보자. 

#include <stdio.h>

void swap1(int, int); //call by value
void swap2(int*, int*); //call by reference

int main(void) {
	int a = 3, b = 8;
	
	int* pa = &a;
	int* pb = &b;

	swap1(a, b);
	printf("a:%d b:%d\n", a, b); //a:3 b:8
	
	swap2(pa, pb); 
	printf("a:%d b:%d\n", a, b); //a:8 b:3

	return 0;
}

void swap1(int a, int b) { //call by value
	int temp;
	temp = a;
	a = b;
	b = temp;
}

void swap2(int* p1, int* p2) { //call by reference
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

함수 swap1은 call by value 방식으로 함수 내에서의 조작이 main 함수에 영향을 끼치지 않는다. 반면, 함수 swap2는 call by reference 방식으로 주소 값을 매개변수로 받는다. 따라서 함수 내에서 a, b의 값을 바꾸면 main 함수에도 그대로 반영된다.