C++ Academy · 课时

nullptr 与空指针安全

使用 nullptr 代替 NULL 或 0,并防止对空指针解引用

第 3 / 4 课13 个步骤

nullptr 与空指针安全 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

什么是空指针

空指针是一种指向“任何对象都没有”的特殊值。对它进行解引用属于未定义行为,通常会因段错误而崩溃。

现代 C++ 中的 nullptr

从 C++11 开始,关键字 nullptr 表示一个带类型的空指针字面量。请优先使用它,而不是 NULL 或 0。

int* p1 = nullptr;
int* p2 = NULL;       // legacy macro
int* p3 = 0;          // legacy literal

为什么使用 nullptr

NULL 只是 0 的一个宏。它可能导致 int 和 int* 之间的重载解析产生歧义。nullptr 具有唯一类型 std::nullptr_t。

void f(int);
void f(int*);

f(NULL);      // calls f(int) -- surprising!
f(nullptr);   // calls f(int*) -- correct

检查空指针

指针可以隐式转换为 bool:非空时为真,空时为假。

if (p) std::cout << "has value\n";
if (!p) std::cout << "is null\n";
if (p != nullptr) std::cout << "explicit form\n";

始终初始化

未初始化的指针包含垃圾值,仿佛指向某个位置。请始终初始化指针,即使只是将其初始化为 nullptr。

int* p;            // BAD: undefined contents
int* q = nullptr;  // GOOD

解引用空指针

通过空指针读取或写入属于未定义行为。在大多数桌面系统上会触发段错误;在嵌入式设备上则可能悄无声息地破坏内存。

防御性检查

在公共 API 中,或调用方可能传入空指针时,请在解引用之前进行检查。

void process(int* data) {
    if (!data) return;
    *data *= 2;
}

用引用代替指针

如果空值永远没有意义,请使用引用参数。编译器会保证该引用绑定到某个对象。

// Before
void f(Widget* w);   // can be null?

// After
void f(Widget& w);   // must be a real widget

使用 std::optional 表示可选值

C++17 增加了 std::optional<T>,用于表达“可能有一个值”的语义;在不涉及分配的场景中,它比可为空的指针更清晰。

#include <optional>
std::optional<int> find(int x);
if (auto v = find(42)) std::cout << *v;

智能指针与空值

std::unique_ptr 和 std::shared_ptr 也可以为空。它们可以转换为 bool 以进行检查,并通过 = nullptr 重置。

陷阱:删除后悬空

执行 delete p 后,指针仍然保存着旧地址。请重置它:p = nullptr;。智能指针会自动完成此操作。

快速检查

在现代 C++ 中,应该使用哪个空指针字面量?

回顾

使用 nullptr 表示空指针值。始终初始化指针。在解引用之前进行检查;更好的做法是,在空值永远无效时使用引用,在需要可选值时使用 std::optional。

免费开始

用 AI 导师学习 C++ — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
51
课程
203

常见问题解答

「nullptr 与空指针安全」课时是免费的吗?

是的 — 「nullptr 与空指针安全」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「nullptr 与空指针安全」这节课中我会学到什么?

使用 nullptr 代替 NULL 或 0,并防止对空指针解引用 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「nullptr 与空指针安全」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 原始指针与取地址运算符
  2. 解引用与指针运算
  3. nullptr 与空指针安全
  4. 何时使用指针而非引用
← 返回 C++ Academy