[C++] NULL Pointer | 널 포인터
NULL Pointer
널 포인터
C++11 이전 버전
- 0은 숫자 값(Zero)과 널 포인터 두 가지 의미로 혼재되어 있었다.
- 이 때문에 많은 Reader 와 컴파일러가 두 의미를 구분짓는 데 어려움을 겪었다.
- 이 두 가지 의미를 구분하기 위해, 널 포인터를 (void*) 0
으로 표현하기도 했다.
- C 매크로를 통해 정의된 NULL
을 사용하기도 했다.
(NULL
은 다수의 헤더파일에서 0으로 정의되어 있는 기호상수이다.)
C++11 이후 버전
- C++11부터는 새로운 키워드 nullptr
을 통해 널 포인터를 표현할 수 있게 되었다.
- 기존에 사용했던, 0을 비롯한 다양한 표현들을 아직도 사용가능하지만, nullptr
을 사용할 것이 권장된다.
Exampel. nullptr
Usage
char* str = nullptr;
- 또한, NULL
포인터에는 delete
연산을 적용할 수 있다.
void Pointer (void 포인터)
- 다른 포인터들과 같이 주솟값을 저장하긴 하지만,
정작 지시하고 있는 메모리 위치에 어떤 타입의 데이터가 있는지는 모르는 포인터이다.
- 메모리에 이진수(데이터)들이 나열되어 있는데,
이 데이터가 정수인지, 실수인지, 사용자 정의 데이터형인지에 따라 해석하는 방식이 달라지기 때문에
어떤 데이터가 무슨 타입인지를 알려주는 정보가 없다면, 그 데이터는 단순히 나열된 이진수에 불과하다.
- void
포인터는 Casting(형변환)을 통해 타입을 지정시킬 수 있다.
이러한 점에서 void
포인터는 어떠한 데이터라도 담을 수 있다는 장점이 있다.
- C의 malloc()
함수는 void*
형을 리턴하기 때문에,
출력이나 수정을 위해서 반드시 명시적 형변환 과정이 필요한 것이다.
(형변환을 해야 하는 번거로움이 있지만, 데이터형을 마음대로 바꿀 수 있는 큰 장점이 있다.)
Example. void Pointer Usage
int a = 10;
void* p = &a;
cout << *(int*)p; // 10 이 출력된다.
cout << *p; // 오류가 발생한다.