Computer Science/C & C++

[C++] NULL Pointer | 널 포인터

lww7438 2020. 3. 3. 21:17

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;         // 오류가 발생한다.