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 |