CS/C++

call by value, address, reference 차이점 정리

PIYA 2022. 7. 19.

call by value, address, reference 차이점 정리

Call by Value (값 호출)

함수에 인자를 넘겨줄 때, 변수의 값을 넘겨준다.

#include<cstdio>
void swap(int a, int b) {
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    printf("In func: a=%d, b=%d\n", a, b);
}
int main() {
    int a=1;
    int b=2;
    printf("main: a=%d, b=%d\n", a, b);
    swap(a, b);
    printf("After func: a=%d, b=%d\n", a, b);
}

실행시켜보면, 함수를 빠져나왔을 때 값이 변하지 않았음을 확인할 수 있다.
즉 주소를 전달한 게 아니라 값만 함수에 전달했기 때문에 함수가 의도한대로 실행되지 않았으며,
이를 콜바이밸류라 한다.

Call by Address (주소로 전달)

이번에는 넘겨줄 때, 엠퍼센드 연산자를 이용하여 주소를 넘겨준다.
아래와 같이 함수에 주소를 넘겨주는 방식을 콜바이어드레스라 한다.

#include<cstdio>
void swap(int* a, int* b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
    printf("In func: a=%d, b=%d\n", *a, *b);
}
int main() {
    int a=1;
    int b=2;
    printf("main: a=%d, b=%d\n", a, b);
    swap(&a, &b);
    printf("After func: a=%d, b=%d\n", a, b);
}

Call by Reference (참조로 전달) - C++ 문법

C++에서만 지원하기때문에 확장자가 c인 경우 안된다.
얘는 레퍼런스변수를 이해하면 된다.

#include<cstdio>
void swap(int& a, int& b) {
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    printf("In func: a=%d, b=%d\n", a, b);
}
int main() {
    int a=1;
    int b=2;
    printf("main: a=%d, b=%d\n", a, b);
    swap(a, b);
    printf("After func: a=%d, b=%d\n", a, b);
}

댓글