代码仓库shanchuann/CPP-Learninng

在 C++ 中,nullptr是 C++11 标准引入的关键字,专门用于表示空指针,其设计目的是解决传统NULL在表示空指针时的歧义问题。

C++11 之前,通常用NULL表示空指针,但NULL本质是一个宏(定义为0(void*)0),这会导致一些歧义:

NULL被定义为0(多数编译器如此),当函数重载时,NULL会被当作整数0处理,而非指针类型,可能匹配错误的重载函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Nullptrfunc(int a)
{
cout << "int a = " << a << endl;
}
void Nullptrfunc(char* p)
{
if (p == nullptr)
{
cout << "char* p = nullptr" << endl;
}
else
{
cout << "char* p = " << p << endl;
}
}
int main() {
Nullptrfunc(0); //调用int a
Nullptrfunc(NULL); //调用int a
Nullptrfunc(nullptr); //调用char* p
return 0;
}

显而易见的,当我们试图使用NULL作为空指针来使用时,编译器会将其当作0来使用

这是因为在C++中对NULL进行了简单的替换

1
#define NULL 0

不同于NULL,nullptr作为指针类型不可以对非指针类型进行赋值

nullptr是 C++11 新增的关键字,专门用于表示空指针,具有以下特性:

  1. 类型明确nullptr的类型是nullptr_t(一种特殊的空指针类型),它可以隐式转换为任何指针类型(包括类指针、函数指针等),但不能转换为整数类型(避免歧义)。

  2. 解决重载歧义:对于上面的重载函数,用nullptr调用时会正确匹配指针版本:

    1
    2
    3
    4
    int main() {
    func(nullptr); // 正确调用func(char*),因为nullptr是指针类型
    return 0;
    }
  3. 安全性nullptr不能赋值给非指针变量(如int),而NULL(作为0)可以,因此nullptr更安全:

    1
    2
    int x = nullptr;  // 错误:nullptr不能转换为int
    int* p = nullptr; // 正确:nullptr可转换为指针类型

nullptr主要用于初始化或赋值指针,表示 “指针未指向任何有效对象”:

  1. 初始化指针:

    1
    2
    int* p = nullptr;  // 初始化空指针
    char* str = nullptr;
  2. 指针判空:

    1
    2
    3
    if (p == nullptr) {  // 判断指针是否为空
    std::cout << "p是空指针" << std::endl;
    }
  3. 函数返回空指针:

    1
    2
    3
    4
    int* find() {
    // 未找到目标时返回空指针
    return nullptr;
    }