如何选择指针中置空?NULL, nullptr, 0?

本文探讨了在C++11中使用nullptr代替NULL的原因及其带来的好处,特别是在避免指针类型混淆方面的作用。

  在使用指针的时候,为了防止野指针,我们要对指针初始置空。以前一直使用*ptr = NULL,其中NULL和0是完全等价的。这就造成了一个潜在的危险,当我们将void f(int*)这个函数重定义一个void f(int)函数。这个时候我们传入参数0, 就无法判断0是int类型还是int*类型。c++11使用nullptr代替了NULL,在上述情况下能避免歧义,不会出现错误。
  所以,在支持C++11情况下我们使用nullptr,在不支持的情况下,我们使用0而不用NULL来提醒自己避免错误。

是的,`nullptr` 是 C++11 引入的**指针常量**,用于明确表示指针不指向任何对象或函数,它与 C 语言中的 `NULL` 有本质区别,具体如下: --- ### **1. `nullptr` 的特性** - **类型安全**:`nullptr` 是 `std::nullptr_t` 类型的常量,能隐式转换为任何指针类型(如 `int*`、`char*` 等),但**不会**被隐式转换为整数类型(如 `int`)。 - **避免重载歧义**:在函数重载中,`nullptr` 能明确区分指针参数和整数参数,而 `NULL` 可能因隐式转换导致歧义。 - **示例**: ```cpp void foo(int* ptr) { /* ... */ } void foo(int num) { /* ... */ } int main() { foo(nullptr); // 调用 foo(int*) foo(NULL); // 可能调用 foo(int)(若 NULL 定义为 0) } ``` --- ### **2. C 语言中的 `NULL`** - **定义**:`NULL` 是 C 标准中定义的宏,通常表示为 `(void*)0` 或简单的 `0`(由实现决定)。 - **类型不安全**:`NULL` 在 C 中可能被隐式转换为整数类型,导致潜在错误。 - **示例**: ```c #include <stdio.h> void foo(int* ptr) { printf("Pointer\n"); } void foo(int num) { printf("Integer\n"); } int main() { foo(NULL); // 可能调用 foo(int)(若 NULL 定义为 0) return 0; } ``` --- ### **3. 关键区别** | 特性 | `nullptr` (C++11) | `NULL` (C/C++) | |---------------------|---------------------------------|-----------------------------| | **类型** | `std::nullptr_t` | 通常为 `(void*)0` 或 `0` | | **隐式转换** | 仅指针类型 | 指针或整数类型 | | **重载解析** | 明确匹配指针参数 | 可能匹配整数参数 | | **线程安全** | 是(常量) | 是(宏展开为常量) | | **可读性** | 明确表示指针 | 依赖实现,可能混淆 | --- ### **4. 代码对比** #### **C++ 中推荐使用 `nullptr`** ```cpp #include <iostream> void process(int* ptr) { std::cout << "Pointer\n"; } void process(int num) { std::cout << "Integer\n"; } int main() { process(nullptr); // 输出 "Pointer" process(NULL); // 可能输出 "Integer"(若 NULL=0) return 0; } ``` #### **C 中必须使用 `NULL`** ```c #include <stdio.h> int main() { int* ptr = NULL; // 合法,但类型不明确 if (ptr == 0) { // 显式比较 printf("ptr is NULL\n"); } return 0; } ``` --- ### **5. 最佳实践** - **C++**:始终使用 `nullptr` 替代 `NULL` 或 `0`,以提高代码安全性和可读性。 - **C**:使用 `NULL`(或 `0`),但需注意类型隐式转换问题。 - **C++11 之后**:`NULL` 仍可用,但已逐渐被弃用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值