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' 카테고리의 다른 글
[C] malloc, free 로 메모리 동적 할당 해제하기 (0) | 2018.06.27 |
---|---|
[C] memcmp 메모리 블록을 비교하는 함수 (0) | 2018.06.27 |
[C] memcpy 문자열을 지정 바이트 범위만큼 복사하는 함수 (0) | 2018.05.01 |
[C] memset 바이트 단위로 값을 지정하는 함수 (0) | 2018.04.27 |
[C] 포인터 Pointer 알아보기 (0) | 2018.02.20 |