포인터를 배우면 꼭 배우는 개념이 바로
콜 바이 벨류 (Call by value)와
콜 바이 레퍼런스 (Call by reference)입니다
이 두 가지에 대해 배워보겠습니다.
자 우선 아래 코드를 보시죠
#include <stdio.h>
void Test(int n)
{
n = 34;
}
int main()
{
int a = 0;
Test(a);
printf("%d",a);
}
자 이 코드의 수행 결과는 뭘까요?
34가 출력될까요?
아니요, 0이출력됩니다.
왜냐하면 Test함수에 넘겨주는 매개변수는
'값'을 넘겨주는 것이기 때문입니다
변수 a 자체를 넘겨주는 게 아니라 변수 a의 값인 0을
Test의 n변수에 할당해주는 것이기 때문에 저 코드를 수행해도
a의 값은 변하지 않고 printf함수에 의해 0이 출력됩니다.
이를 값, 즉 value를 사용해 호출한다 라고 해서 Call by value 콜 바이 벨류라고 부릅니다.
하지만 여기에 포인터 개념을 추가해서 바꿀 수가 있습니다
아래 코드를 보시죠!
#include <stdio.h>
void Test(int * n)
{
*n = 34;
}
int main()
{
int a = 0;
Test(&a);
printf("%d",a);
}
자 이 코드는 수행하면 어떻게 될까요?
Test함수의 매개변수로 a의 주소 값을 주고 있습니다.
즉 Test함수의 n변수에는 a의 주소 값이 할당된다는 거죠
그리고 Test함수의 코드에서 n의 값 부분에 접근하여 34로 바꿔주니
메인 함수의 a의 주소에 접근하여 값을 34로 바꾼 것이고
위와 같은 코드는 a가 34로 바뀐 채 화면에 출력하게 됩니다.
이를 참조, 즉 reference를 사용해 호출한다!라고 해서 Call by reference 콜 바이 레퍼런스라고 부릅니다!
변수를 예를 들어 쉽게 설명하자면
int a = 0;
int b = a;
b = 3;
이렇게 한다고 a가 3으로 변하지 않지만
int a = 0;
int * b = &a;
*b = 30;
이렇게 하면 a의 값이 변하겠죠
위가 Call by value이고
아래가 Call by reference라고 생각하시면 됩니다!
매우 중요한 내용이니 꼭 외우시길 바라고
오늘 강좌는 여기에서 마치도록 하겠습니다
수고하셨습니다!
'C' 카테고리의 다른 글
([C언어] 18강) 구조체 (0) | 2019.07.15 |
---|---|
([C언어] 17강) 포인터의 포인터와, 포인터의 메모리크기 (0) | 2019.06.28 |
([C언어] 15강) 포인터와 어드레스연산자 (0) | 2019.06.27 |
([C언어] 14강) 함수의 생성과 반환값 (0) | 2019.06.27 |
([C언어] 13강) sizeof연산자로 배열 길이 구하기 (0) | 2019.06.27 |