C언어(2020년)

25. Call by Value, Call by reference, Call by Address

리더2333 2020. 11. 4. 01:17
반응형

Call By Value 값에 의한 호출

Call By Reference 참조에 의한 호출

Call By Address 주소에 의한 호출

 

위 3가지 형식의 함수가 존재 한다.

// Call By Value
int add(int a, int b)
{
    int c = a + b;
    return c;
}

int main()
{
    int num1 = 10;
    int num2 = 20;
    int num3 = add(num1, num2);
    return 0;
}

위 예제에서 num1 과 num2 는 변경되지 않고, num3 는 30이 대입된다.

 

만약에 

#include <stdio.h>

// Call By Value
int add(int a, int b)
{
    a += 1;
    b += 1;
    int c = a + b;
    return c;
}

int main()
{
    int num1 = 10;
    int num2 = 20;
    int num3 = add(num1, num2);
    printf("%d, %d, %d\n", num1, num2, num3);
    return 0;
}

// 결과 10,20,32

함수가 이런식으로 변경되었다고 해도

num1 은 변경되지 않고 (여전히10)

num2 도 변경되지 않고 (여전히20)

num3 은 결과에 의해 32 가 대입된다.

 

그 이유는 num1 의 값과 num2 의 값이

새로 생성된 int a=num1; int b=num2; 가 대입(복사)되어 들어갔기 때문이다.

a 와 b 의 값을 변경 시켜도, 새로 생성된 변수이기 때문에

num1 과 num2 는 변경되지 않는다.

 

 

 

 

하지만....

#include <stdio.h>

// Call By Reference
int add(int& a, int& b)
{
    a += 1;
    b += 1;
    int c = a + b;
    return c;
}

int main()
{
    int num1 = 10;
    int num2 = 20;
    int num3 = add(num1, num2);
    printf("%d, %d, %d\n", num1, num2, num3);
    return 0;
}

// 결과 11,21,32

이 경우에는 Referrence 에 의한 호출로 정의 함수인데,

결과는 num1 은 11로, num2 는 21로 변경되어지고

num3은 32가 된다.

 

여기에서 num1 과 num2 가 변경된다는 점에 주목해야한다.

참조(Reference)에 의한 호출은

num1 과 num2 가 인자로 들어갈때

int a, int b 가 새로 생성되는 것이 아니라.

num1 를 함수내에서는 a 라고 부르겠다.

num2 를 함수 내에서는 b 라고 부르겠다.

라고 이해 하면 된다.

즉 부르는 별명만 바뀐것이기 때문에, a+=1 라는 의미는 num1+=1 의 의미이다

마찬가지로 b+=1 라는 의미는 num2+=1 라는 의미이다.

 

 

 

 

 

그리고....

#include <stdio.h>

// Call By Adrress
int add(int* a, int* b)
{
    *a += 1;
    *b += 1;
    int c = *a + *b;
    return c;
}

int main()
{
    int num1 = 10;
    int num2 = 20;
    int num3 = add(&num1, &num2);
    printf("%d, %d, %d\n", num1, num2, num3);
    return 0;
}

// 결과 11,21,32

이것은 num1 의 주소와 num2 의 포인터 주소를 인자로 받은 후에

함수내부에서 포인터 주소에 해당하는 곳의 값을 변경시켰기 때문에

함수 호출 후에 num1 과 num2 의 값이 변경된다.

 

결과는 Call By Reference 와 Call By Adrress 가 같지만,

의미상으로는 다르다.

반응형

'C언어(2020년)' 카테고리의 다른 글

27. 전처리기  (0) 2020.11.04
26. 가변인자 함수 만들기  (0) 2020.11.04
24. 함수  (0) 2020.11.04
23. define  (0) 2020.11.04
22. const  (0) 2020.11.04