Call By Value 와 Call By Reference

함수에서 인자를 전달하는 방식의 차이점에 따라 불리는 명칭입니다.

Call By Value 는 값을 전달, Call By Reference 는 값 주소를 전달합니다.



Call By Value

변수의 주소를 전달하지 않고, 값을 전달하기 때문에 다른 함수로 전달된 인자는 전달된 함수 내에서만 적용받게 됩니다.


소스를 수행하면 다음 단계가 진행됩니다.

1. main 함수에서 value 의 변수 주소를 생성한 뒤, 이 주소에 10이라는 값을 저장합니다.

2. main 함수에서 Value 함수에 value 는 10이라는 값을 전달합니다.

3. Value 함수 내에는 value 라는 새로운 변수 주소를 생성한 뒤, 이 주소에 연산을 수행합니다.

4. Value 함수가 다 끝난 뒤, main 함수로 돌아오며 main 함수에서는 main 함수의 value 주소를 사용합니다.

5. main 함수와 Value 함수가 사용하는 value 주소가 다르기 때문에 main 함수에서는 value 값이 변경되지 않습니다.

#include <stdio.h>

main()
{

        int rvalue = 0;
        int value  = 10;

        printf("Before Func %d\n", value);

        rvalue = Value(value);
        printf("After  Func %d\n", value);

        rvalue = Value(value);
        printf("After  Func %d\n", value);

        return 0;
}

int Value(int value)
{
        value = value + value;
        printf("Inner  Func %d\n", value);
}
Before Func 10
Inner  Func 20
After  Func 10
Inner  Func 20
After  Func 10


Call By Reference

주소를 전달하기 때문에, 다른 함수에서 변경된 값은 다른 함수에서도 적용받게 됩니다.


소스를 수행하면 다음 단계가 진행됩니다.

1. main 함수에서 value 의 변수 주소를 생성한 뒤, 이 주소에 10이라는 값을 저장합니다.

2. main 함수에서 Value 함수에 value 의 주소를 전달합니다.

3. Value 함수 내에는 value 의 기존 주소에서 연산을 수행합니다.

4. Value 함수가 다 끝난 뒤, main 함수로 돌아옵니다.

5. main 함수와 Value 함수가 사용하는 value 주소가 같기 때문에 main 함수에서도 value 값이 변경됩니다.

#include <stdio.h>

main()
{

        int rvalue = 0;
        int value  = 10;

        printf("Before Func %d\n", value);

        rvalue = Value(&value);
        printf("After  Func %d\n", value);

        rvalue = Value(&value);
        printf("After  Func %d\n", value);

        return 0;
}

int Value(int *value)
{
        *value = *value + *value;
        printf("Inner  Func %d\n", *value);
}
Before Func 10
Inner  Func 20
After  Func 20
Inner  Func 40
After  Func 40



주소를 전달하기 위해서는 포인터가 사용되어야 하며, 이 포스팅에서는 다루지 않습니다.


'Computer Language > C' 카테고리의 다른 글

Call By Value 와 Call By Reference  (0) 01:23:54