C++中空指针为什么用 nullptr,而不是NULL ?

32 阅读1分钟

为什么要用 nullptr 而不是 NULL(ο´・д・)??

1. nullptr 有独立的类型:std::nullptr_t

  • 只表示“空指针”。

  • 类型明确,避免类型不一致问题。

void f(int){ cout<<"NULL"<<endl;};
void f(int*){ cout<<"nullptr"<<endl;};

f(NULL);     // 调用 f(int) —— 因为 NULL 是 0
f(nullptr);  // 调用 f(int*) —— 正确

std::nullptr_t 是空指针字面量 nullptr 的类型。它是一种不同的类型,本身不是指针类型或指向成员的指针类型。此类型的纯右值是空指针常量,并且可以隐式转换为任何指针和指向成员的指针类型。sizeof(std::nullptr_t) 等于 sizeof(void *)。

2. NULL 本质是 0 或 ((void*)0)

在 C++ 中通常是:

#define NULL 0
// since C++11
#define NULL nullptr

这会导致函数重载、模板推导出现歧义。

在 C 中,宏 NULL 可能具有类型 void*,但在 C++ 中不允许,因为空指针常量不能具有该类型。

什么时候必须用 nullptr

  • 初始化指针
  • 判断指针是否为空
  • 作为函数参数传递空指针
  • 返回空指针
ListNode* head = nullptr;

if (head == nullptr) {
    // ...
}

return nullptr;