NULL
#define으로 0을 정의한 매크로
포인터가 유효한 주소를 가리키지 않는 상태를 나타내기 위해 사용한다.
NULL은 포인터가 아니라 정수 0으로 정의된 매크로이며, 컴파일 시 0으로 치환된다.
NULL 사용 예시
int* p = NULL;
0은 C/C++에서 특별하게 null pointer constant로 취급되기 때문에 포인터에 대입할 수 있다.
포인터는 내부적으로 주소값을 저장하지만, 일반 정수와 달리 해당 값을 메모리 주소로 해석하여 사용한다.
따라서 NULL은 값 자체는 0이지만 의미적으로는
유효한 메모리를 가리키지 않는 포인터를 나타낸다.
NULL의 문제점
void func(int x);
void func(int* x);
func(NULL);
NULL은 정수 0으로 정의되어 있기 때문에
func(int x);
로 전달될 수 있다.
또한 0은 null pointer constant로도 취급되기 때문에
func(int* x);
로도 전달될 수 있다.
즉,
func(NULL);
은 두 함수 모두 호출 후보가 된다.
func(int x);
func(int* x);
컴파일러는 어떤 함수를 호출해야 할지 결정할 수 없으므로 모호성 오류(ambiguous call)가 발생한다.
nullptr
C++11부터는 nullptr가 추가되었다.
int* p = nullptr;
nullptr는 포인터 전용 리터럴이므로 정수형으로 변환되지 않는다.
void func(int x);
void func(int* x);
func(nullptr);
위 코드는
func(int* x);
를 정확하게 호출한다.
따라서 현대 C++에서는 NULL보다 nullptr 사용을 권장한다.
정리
| 구분 | NULL | nullptr |
|---|---|---|
| 타입 | 정수 0 매크로 | 포인터 전용 리터럴 |
| C 지원 | O | X |
| C++ 지원 | O | C++11 이상 |
| 함수 오버로딩 문제 | 발생 가능 | 없음 |
| 권장 여부 | 비권장 | 권장 |
int* p1 = NULL;
int* p2 = nullptr;'c++ > 기초' 카테고리의 다른 글
| 분할 구조 (Header / Source File) (0) | 2026.06.05 |
|---|---|
| nullptr (0) | 2026.06.05 |
| 참조자(Reference) (0) | 2026.05.31 |
| 포인터 (0) | 2026.05.31 |
| 매크로 (0) | 2026.05.31 |