본문 바로가기
개발/C, C++

C++ 포인터와 참조자 (pointer vs reference)

by 피로물든딸기 2021. 5. 1.
반응형

C, C++ 전체 링크

 

포인터참조자 모두 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)

반응형

댓글