C

C 공부 11일차 Chapter 14 함수 호출 방식 Call-by-value, Call-by-reference

yeooniyeoon 2022. 9. 16. 23:53
728x90
SMALL

Call-by-value, Call-by-reference

함수 호출 방식은 함수 인자로 전달되는 대상에 따라 2가지로 나눌 수 있다.

단순히 값을 전달하는 형태이면 Call-by-value

메모리에 접근 가능한 주소값을 전달하는 형태면 Call-by-reference로 구분 가능하다.

 

 

 

이와 같이 호출 방식을 구분하는 이유는 다음과 같다.

예를 들어 두 값을 전달받아 서로 값을 교환하는 swap 함수를 작성한다고 하면

 

Call-by-value 형식으로 함수 작성 시 아래와 같다.

 

void swap(int num1, int num2){
	int temp = num1;
    int num1 = num2;
    num2 = temp;
    printf("num1=%d, num2=%d", num1, num2);
}

int main(void){
	int n1=10, n2=20;
    swap(n1, n2);
    printf("n1=%d, n2=%d", n1, n2);
}

 

이 코드를 실행하면 swap 함수 내에 선언된 변수 num1과 num2는 서로 값이 교환되지만

main 함수 내에 있는 n1과 n2는 변수의 주소가 아닌 변수가 가진 값만 전달 되었으므로 값이 바뀌지 않는다.

이와 같은 문제를 해결하기 위해서 Call-by-reference 형태를 사용한다.

 

void swap(int * ptr1, int * ptr2){
	int temp = *ptr1;
    int *ptr = *ptr2;
    *ptr2 = temp;
}

int main(void){
	int n1=10, n2=20;
    swap(&n1, &n2);
    printf("n1=%d, n2=%d", n1, n2);
}

 

Call-by-refence 방식을 사용하면 위의 문제가 해결된다.

swap 함수 호출 시 n1과 n2의 주소값을 인자로 전달했으므로

실제 n1과 n2의 값이 교환되는 것이다.

 

 

 

이제 scanf 사용 시 입력받은 값이 저장될 위치의 변수 앞에 &를 붙이는 이유도 이해가 될 것이다.

값을 저장할 변수의 주소값을 전달함으로써 메모리 공간에 접근하여 직접 값을 저장하게 되는 것이다.

 

마찬가지로 문자열을 입력받을 때는 &를 붙이지 않는 이유는

배열은 배열명 그 자체로 주소값을 가르키기 때문이다!

728x90
반응형
SMALL