참조자(Reference, 레퍼런스)
- 변수라고 하는 것은 할당된 메모리 공간에 붙여진 이름이다. 이름을 사용하면 해당 메모리 공간에 접근이 가능해진다.
- 참조자는 이러한 변수에 다른 이름을 붙이는 것을 말한다.
- 대상이 이름이 존재하지 않을 경우에는 참조할 수 없다.
선언 방법
int num = 1;
int& ref1 = num; // 참조자 선언
int& ref2; // Compile Error: 초기화 필요
포인터
- 포인터는 변수의 주소를 저장하는 변수이며 포인터, 포인터 변수 다 같은 의미로 쓰인다.
- 주소만을 저장할 수 있는 변수를 포인터 변수라고 하고 일반적인 변수 선언과는 다르게 자료형에 * 표시를 붙여 선언한다.
- 포인터가 가리키는 값을 가져오는 것을 역참조라고 한다.
선언 방법
int n = 100; // 변수의 선언
int *ptr = &n; // 포인터의 선언
nt **pptr = &ptr; // 포인터의 참조
printf("%d/n", *ptr); // 포인터의 역참조
&(레퍼런스)와 *(포인터)의 차이
1. 포인터는 NULL을 허용하지만 레퍼런스는 NULL이 허용되지 않는다.
포인터를 다룰 때 마주칠 수 있는 ‘Null pointer exception’ 또는 ‘Segmentation Fault’ 에러들의 대부분의 원인은 포인터를 초기화하지 않거나 NULL을 가리키고 있는 포인터에 접근했을 때 발생한다.
포인터 변수를 사용할 때에는 포인터가 NULL인지 여부를 확인하는 코드(validation)로 처리하여 에러를 예방해야 한다.
if (ptr != NULL)
printf("%d\n", &ptr);
else
printf("ptr is null\n");
2. 포인터는 참조 대상에 대해 & 연산을 통해 주소 값을 할당하고, 레퍼런스는 참조 대상을 그대로 할당한다.
int a = 10;
int *p = &a; // 포인터는 주소값을 할당
int &r = a; // 레퍼런스는 대상을 직접 할당
레퍼런스는 선언과 동시에 초기화를 하지 않으면 컴파일 오류 발생한다.
포인터는 넘겨받은 참조를 사용할 때에도 *, -> 등의 포인터 연산자를 통해 접근해야 하지만 레퍼런스는 마치 일반 변수처럼 접근할 수 있다.
(다만 레퍼런스의 값을 변경하면 레퍼런스가 참조하고 있는 실제 변수의 값이 변경된다.)
3. 포인터는 메모리 공간을 소모한다.
포인터는 주소 값을 저장하기 위해 별도의 메모리 공간을 소모하지만, 레퍼런스는 같은 메모리 공간을 참조하므로 메모리 공간을 소모하지 않는다.
http://www.tcpschool.com/cpp/cpp_arrayPointer_pointerIntro
https://woo-dev.tistory.com/43
https://gracefulprograming.tistory.com/11
https://ssinyoung.tistory.com/16
'Language & Technique > 기술(technique)' 카테고리의 다른 글
[자료구조] Pair 와 Map (0) | 2022.10.01 |
---|---|
DFS - 조합과 순열 (0) | 2022.08.15 |
그래프 - DFS 와 BFS (2) | 2022.03.14 |