C - call by value / call by reference

2022. 4. 5. 21:46C

#include <stdio.h>

void swap(int x, int y){
 int tmp = x;
     x = y;
     y = tmp;     
}
int main() {
	int a, b;
    scanf("%d%d", &a, &b);
    swap(a, b);
}

a와 b의 값을 서로 바꾸는 swap 함수이다.

분명 코드만 보면 a와 b의 값이 바뀌어야 하는데 결과적으론 바뀌지 않는다.

 

입력 값이 a = 2, b = 3이라고 가정하자

swap 함수 안으로 매개변수 x, y를 받으면

x = 3,  y = 2로 바뀐다.

하지만 함수가 종료되면 a,b와 x,y는 다르다.

핵심은 a, b를 통해 x, y의 값을 전달해줬고 x,y의 값이 각각 바뀌게 된 것이다

이렇게 a,b의 값을 넘겨준 것을 call by value라 하며

변수 자체를 넘긴것이 아닌 값만 넘겨준 방식이다.

#include <stdio.h>

void swap(int *x, int *y){
 int tmp = *x;
     *x = *y;
     *y = tmp;     
}
int main() {
	int a, b;
    scanf("%d%d", &a, &b);
    swap(&a, &b);
}

포인터를 이용한 swap 함수를 살펴보자

a = 2, b = 3 각각의 주소 값은 100, 200이라고 가정하자

그러면 swap(&a, &b)함수가 실행 되면 x엔 100 y엔 200이란 값을 전달해준다

 

주소값을 통해 값을 바꾸고 함수가 종료 되었기 때문에 메인함수에서 a,b의 값도 변경된 상태가 된다.

메모리 상에서 a와 b의 영역에 직접 접근하여 값을 바꾼 방식을 call by reference이다. 

 

call by value : 값에 의한 호출

장점 : 복사하여 처리하기 때문에 안전하며 원래의 값이 보존이 된다

단점 : 복사를 하기 때문에 메모리 사용량 증가

call by reference : 참조에 의한 호출

장점 : 복사하지 않고 직접 참조를 하기 때문에 당연히 빠르다

단점 : 직접 참조를 하기에 원래 값에 영향이 간다