본문 바로가기

BackEnd/C

Call-By-Value vs Call-By-Reference

반응형

포인터를 이용하면 함수내에서 외부에 있는 변수에 직접 접근이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#include <stdio.h>
 
void CallByVal(int num)
{
    num++;
}
 
void CallByRef(int * ptr)
{
    (*ptr)++;
}
 
int main(void)
{
    int val=10;
 
    CallByVal(val);
    printf("CallByVal: %d \n", val);
 
    CallByRef(&val);
    printf("CallByRef: %d \n", val);
 
    return 0;
}
cs


1
2
CallByVal: 10
CallByRef: 11
cs


3행에서 이 함수가 하는 일은 매개변수인 num에 저장된 값을 1증가시키는게 전부다.


즉 val과 num은 별개의 변수인것이다. 따라서 main함수에 선언된 변수 val에 아무런 영향을 안 미친다.


이렇게 변수에 저장된 값을 복사해서 전달하는 형태의 함수호출을 가리켜 값에 의한 호출 

Call-By-Value 라 한다.


하지만 8행에서 주소값을 입력 받고, 받은 주소값의 메모리에 저장된 값을 1증가시킨다.


결과적으로 메인함수에서 선언된 변수 val의 값이 1증가한다. 


이렇게 주소 값을 전달하는 형태의 함수 호출을 가리켜 참조에 의한 호출 Call-By-Reference라 한다. 


여기서 참조란 포인터를 의미한다. 


포인터는 변수를 참조할 수 있는 매개체이기 때문이다. 


따라서 이를 포인터에 의한 호출 Call-By-Pointer 이라고도 한다.


반응형