c++/기초

#define 0 NULL

코드망령 2026. 6. 2. 09:36

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