개발자 최승준

[C++] 포인터와 레퍼런스(참조)의 차이점 본문

프로그래밍

[C++] 포인터와 레퍼런스(참조)의 차이점

개발자 최승준 2023. 5. 30. 15:05

C++에서 포인터와 레퍼런스(참조)는 모두 변수나 객체의 메모리 주소에 접근하는 방법을 제공하지만, 몇가지 차이가 있습니다.


 

1. Nullability(Null이 될 수 있는지 여부): 포인터는 NULL 값을 가질 수 있습니다. 이것은 포인터가 아무것도 가리키지 않을 수 있다는 것을 의미합니다. 반면에 참조는 반드시 어떤 객체를 참조해야 하며 NULL 값을 가질 수 없습니다.


int* p = NULL; // 유효
int& r = NULL; // 컴파일 오류

 


2. Reassignment(재할당): 한번 초기화된 후에는 참조는 다른 객체를 참조하도록 변경할 수 없습니다. 반면에 포인터는 언제든지 다른 주소를 가리키도록 변경할 수 있습니다.


int x = 5, y = 10;
int* p = &x; // x의 포인터
p = &y;      // y의 포인터로 변화
int& r = x;  // x의 참조
r = y;       // y를 참조하지 않고 y의 값을 x에 할당합니다. 이제 x와 y는 모두 10

3. Syntax(구문): 포인터는 역참조 연산자(*)를 사용하여 가리키는 값에 접근해야 합니다. 반면에 참조는 일반 변수처럼 사용할 수 있습니다.


int x = 5;
int* p = &x;
int& r = x;
*p = 10; // 포인터를 통해 x값 변경
r = 20;  // 참조를 통해 x값 변경

4. 자세한 표현: 포인터 *x 와 참조 &r 이 존재한다고 가정합니다. 이때 x, &x, r, &r은 무엇을 뜻할까요?


  1. x: x는 포인터입니다. 그러므로 x는 저장되어 있는 주소를 가리킵니다.
  2. &x: &x는 x의 주소입니다. 즉, 포인터 x가 저장되어 있는 메모리의 주소를 나타냅니다.
  3. r: r은 참조입니다. r은 기존 변수에 대한 별칭으로 사용됩니다. r은 변수를 직접 가리키며, r의 값이 변경되면 원래의 변수의 값도 변경됩니다.
  4. &r: &r는 r이 참조하는 변수의 주소입니다. r이 참조하는 변수가 메모리의 어디에 위치하는지 나타냅니다. 참조는 본질적으로 그들이 참조하는 변수의 별칭이므로, &r는 참조되는 변수의 주소를 제공합니다.

int y = 5;
int *x = &y; // x는 y의 주소를 가리키는 포인터입니다.
int &r = y; // r은 y의 참조입니다.

std::cout << "x: " << x << "\n"; // y의 주소를 출력합니다.
std::cout << "&x: " << &x << "\n"; // 포인터 x의 주소를 출력합니다.

std::cout << "r: " << r << "\n"; // y의 값을 출력합니다.
std::cout << "&r: " << &r << "\n"; // y의 주소를 출력합니다.

 

'프로그래밍' 카테고리의 다른 글

리플렉션(Reflection) - 기본 개념  (1) 2024.12.05