본문 바로가기

프로그래밍 언어/C, C++

포인터 vs 참조자

void swap(int *x, int *y)

포인터는 변수의 주소가 파라미터로 전달된다.

 

void swap(int& x, int& y)

참조자는 변수의 Alias가 파라미터로 전달된다. Alias와 파라미터의 주소는 동일하다.

따라서, 참조자의 값 변경시 전달된 변수의 값 또한 바뀐다.

 

차이점)

1. 포인터는 재 할당될 수 있지만, 참조자는 초기화시에 할당되고 재 할당이 안된다.

2. 참조자는 NULL 값을 할당 받을 수 없다. 포인터는 가능하다.

3. 포인터++은 메모리 이동이고, 참조자++은 값 1 증가이다

4.  포인터 변수의 주소와 변수 주소는 서로 다르지만, 참조자 주소와 변수 주소는 서로 동일하다.

5. 포인터는 ->로 멤버에 접근하고, 참조자는 . 로 멤버에 접근한다.

6. 포인터는 *로 역참조가 가능하다. 반면, 참조자는 그 자체로 참조한다.

// C++ program to demonstrate differences
// between pointer and reference
#include <iostream>
using namespace std;

struct demo {
	int a;
};

int main()
{
	int x = 5;
	int y = 6;
	demo d;

	int* p;
	p = &x;
	p = &y; // 1. Pointer reintialization allowed

	int& r = x;
	// &r = y;				 // 1. Compile Error

	r = y; // 1. x value becomes 6

	p = NULL;
	// &r = NULL;			 // 2. Compile Error

	// 3. Points to next memory location
	p++;

	// 3. x values becomes 7
	r++;

	cout << &p << " " << &x << '\n'; // 4. Different address
	cout << &r << " " << &x << '\n'; // 4. Same address

	demo* q = &d;
	demo& qq = d;

	q->a = 8;
	// q.a = 8;				 // 5. Compile Error
	qq.a = 8;
	// qq->a = 8;			 // 5. Compile Error

	// 6. Prints the address
	cout << p << '\n';

	// 6. Print the value of x
	cout << r << '\n';

	return 0;
}
0x7ffc7ed95828 0x7ffc7ed95820
0x7ffc7ed95820 0x7ffc7ed95820
0x4
7

 

 

참고

Passing By Pointer Vs Passing By Reference in C++ - GeeksforGeeks

반응형

'프로그래밍 언어 > C, C++' 카테고리의 다른 글

std::nothrow  (0) 2022.07.29
fstream 처음 위치로 옮겨서 덮어쓰기  (0) 2022.02.27
C++ 파일 입출력 정리  (1) 2022.02.14
Unit testing 이란  (0) 2022.02.13
void 포인터 용법 정리  (0) 2021.08.26