본문 바로가기

▶Programming/C

call by value VS call by reference PART.2

먼저 딴 말 필요없고 아래 코드를 보도록 하자. 

우리가 원하는 것은 num1과 num2의 값이 바뀌어서 출력되는 것이다. 하지만 결과는 fail이다.

call by value : 실제 값을 매개변수로 하여 함수 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void Swap(int n1, int n2)
{
//실제 값을 매개변수로 함수를 호출 한 경우,
//이 함수안에서 아무리 수를 교환해봐야 실제 main안에
//수들은 바뀌지 않는다.
    int temp = n1;
 
    n1 = n2;
 
    n2 = temp;
 
    printf("n1 n2: %d %d \n", n1, n2);
}
int main(void)
 
{
    int num1 = 10;
 
    int num2 = 20;
 
    printf("num1 num2: %d %d \n", num1, num2);
 
    Swap(num1, num2); //num1과 num2가 바뀌길 기대
 
    printf("num1 num2: %d %d\n", num1, num2);
 
    return 0;
 
}
cs

/* 결과화면*/

이렇게 답이 나온다. 즉 우리가 기대했던 num1과 num2의 값이 교환되는 것은 일어나지 않는다.

이유는 바로 n1,n2와 num1,num2가 무관하기 때문이다. 위에 함수 Swap에서는 n1과 n2가 바뀐게 맞다.

하지만 main함수에서는 다시 원래 num1과 num2의 값이 바뀌지 않고 나온다.

그렇다면 우리가 원하는 답! 즉, num1과 num2가 바뀌는 소스는 무엇일까? 아래 적어보도록 하겠다.


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
25
26
27
28
29
30
31
32
void Swap(int *n1, int *n2)
{
//*n1와 *n2는 이들이 가리키는 num1,num2의 값을 직접 찾아 값을 업데이트 한다.
 
    int temp = *n1;
 
    *n1 = *n2;
 
    *n2 = temp;
 
    printf("n1 n2: %d %d \n", *n1, *n2);
 
}
 
int main(void)
 
{
 
    int num1 = 10;
 
    int num2 = 20;
 
    printf("num1 num2: %d %d \n", num1, num2);
 
 
    Swap(&num1,&num2); //num1과 num2가 바뀌길 기대
 
    printf("num1 num2: %d %d\n", num1, num2);
 
    return 0;
 
}
cs

/*결과값*/

*ptr1(여기 코드에선 *n1)의 값이 10->20으로 업데이트.

*ptr2(여기 코드에선 *n2)의 값이 20->10으로 업데이트.