반응형
포인터와 참조자 모두 call by reference로 함수 내에서 변수의 값을 변경할 수 있다.
포인터는 선언 시에 주소를 할당할 필요가 없고, 나중에 다른 주소를 할당할 수 있지만,
참조자는 반드시 처음에 변수를 할당하고, 나중에 변경할수도 없다.
포인터가 함수로 넘어가면 새로운 포인터에 포인터의 주소를 복사하기 때문에 메모리가 필요하지만,
참조자는 이름만 빌리기 때문에 메모리가 필요없다.
포인터는 변수를 바꾸기 위해 * 연산자를 이용하지만,
참조자는 이름만 바뀌었으므로 그대로 변경하면 된다.
아래의 내용을 실행해서 포인터와 참조자의 차이를 비교해보자.
#include <stdio.h>
void checkPointer(int* ptr)
{
printf("-------checkPointer-------\n");
printf("ptr의 주소 0x%x\n", &ptr);
printf("ptr이 가리키는 주소 0x%x\n", ptr);
*ptr = 10000;
}
void checkReference(int& ref)
{
printf("------checkReference------\n");
printf("ref의 주소 0x%x\n", &ref);
ref = 20000;
}
int main()
{
int a, b;
a = 100; b = 200;
printf("a : %d, b : %d\n", a, b);
printf("&a : 0x%x, &b : 0x%x\n", &a, &b);
printf("--------------------------\n");
int* ptr;
ptr = &a; /* 나중에 주소 할당 가능 */
int& ref = b; /* 반드시 초기화에만 할당 */
printf("ptr의 주소 0x%x\n", &ptr);
printf("ptr이 가리키는 주소 0x%x\n", ptr);
printf("ref의 주소 0x%x\n", &ref);
printf("\n----- start function -----\n\n");
checkPointer(ptr);
checkReference(ref);
printf("--------------------------\n");
printf("a : %d, ptr : %d\n", a, *ptr);
printf("b : %d, ref : %d\n", b, ref);
return 0;
}
아래는 실행 결과이다.
main에서
a의 주소가 0x7ef7ac
b의 주소가 0x7ef7a0
포인터의 주소는 0x7ef794이다.
포인터에는 a의 주소(&a)를 담았으므로, ptr의 값은 0x7ef7ac가 된다.
그리고 ref의 주소는 b의 주소와 같은 0x7ef7a0임을 알 수 있다.
start function 이후에는
ref의 주소는 여전히 0x7ef7a0이지만
ptr의 주소는 0x7ef6b4로 새로 할당된 것을 알 수 있다.
즉, 포인터를 함수로 넘기면 새로운 포인터에 주소 값을 복사한다.
그리고 두 경우 모두 a와 b의 값을 변경시킨 것을 확인할 수 있다.
(100 → 10000, 200 → 20000)
반응형
'개발 > C, C++' 카테고리의 다른 글
C++ split 함수 구현 (0) | 2021.05.08 |
---|---|
typedef 선언 (0) | 2021.05.02 |
제곱근 Square root : 바빌로니아 법 (The Babylonian Method) (0) | 2021.04.09 |
C++ ofstream을 이용한 FILE 출력 (0) | 2021.03.18 |
에라토스테네스의 체 - 소수 판단 (0) | 2021.03.16 |
댓글