NULL和nullptr到底是什么?它们的区别又是什么?

本文详细比较了C和C++中NULL与nullptr的区别,强调nullptr在类型安全、可读性和重载决议上的优势,提倡在现代C++编程中使用nullptr以避免潜在问题。

目录

1.前言

2.剖析NULL

3. 剖析nullptr

4.nullptr与NULL的区别


1.前言

为了保持良好的编程习惯,我们在声明某个变量时都应该给这个变量合适的初始值,不然容易出现不可预知的错误。对于指针来说更是如此,在c语言中我们就通常将暂时没有指向的指针置为NULL.

2.剖析NULL

NULL 是一个宏,通常被用来表示空指针。在C和C++的早期版本中,NULL 通常被定义为0或者((void*)0),用于表示一个无效或未初始化的指针。

在传统的C头文件(stddef.h)中,可以看到如下代码

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如

程序本意是想通过f(NULL)调用指针版本

<think>好的,我现在要解决用户关于C++NULLnullptr区别的问题。首先,我需要回忆一下C++中这两个关键字的背景用途。用户可能已经知道指针的基本概念,但需要更深入的比较。 首先,NULLC++中的定义。我记得在早期的C语言中,NULL通常被定义为(void*)0,但在C++中,由于类型系统的严格性,NULL被定义为0或者0L。这是因为C++不允许直接将void*隐式转换为其他指针类型。因此,NULLC++中实际上是一个整型常量0,这可能导致一些类型推导的问题,特别是在函数重载的情况下。 然后是nullptr,这是C++11引入的新关键字。它的类型是std::nullptr_t,可以隐式转换为任何指针类型,但不会转换为整型。这解决了NULL在重载函数中可能被误认为整型的问题。例如,当有重载函数接受指针整型参数时,传递NULL可能导致调用整型版本,而nullptr会正确调用指针版本。 接下来,我需要检查用户提供的引用内容。引用[1]提到在C++中,NULL被定义为0,主要是美学上的差异,但有些人可能误以为NULL与0不同或不是整型。此外,NULL在旧代码中可能有不同的定义,导致问题。引用[2]建议使用nullptr,因为它更安全语义清晰,如示例中所示。引用[3][4]中的代码示例展示了在检查指针是否为空时使用nullptr的情况,比如在插入操作中判断root是否为nullptr。 然后,用户的问题是关于NULLnullptr区别。我需要将这些信息组织起来,分点说明它们的区别,包括类型、安全性、适用场景等方面。同时,要确保回答符合用户的要求,结构清晰,并引用提供的参考资料。 可能需要注意的几点: 1. 类型差异:NULL是整型,nullptr是std::nullptr_t。 2. 重载问题:使用NULL可能导致函数重载解析错误。 3. 代码安全性清晰度:nullptr明确表示空指针,避免歧义。 4. C++11及以后版本的推荐做法。 还需要生成相关问题,比如类型转换问题、兼容性、历史背景等,以帮助用户进一步学习。 最后,确保回答使用中文,行内公式正确,引用标识正确添加。例如,引用[^1][^2]来自用户提供的参考内容。</think>### C++NULLnullptr区别 #### 1. **类型定义差异** - **NULL**:在C++中通常被定义为整型常量`0`或`0L`。例如: ```cpp #define NULL 0 ``` 这意味着`int* ptr = NULL`等价于`int* ptr = 0`[^1]。 - **nullptr**:是C++11引入的关键字,类型为`std::nullptr_t`,可隐式转换为任何指针类型,但不会隐式转换为整型[^2]。 #### 2. **函数重载问题** - 使用`NULL`可能导致函数重载错误。例如: ```cpp void func(int); void func(int*); func(NULL); // 调用func(int),而非func(int*) ``` 而`nullptr`能明确调用指针版本: ```cpp func(nullptr); // 调用func(int*) ``` #### 3. **类型安全** - **NULL**:可能引发类型混淆,例如将`NULL`赋值给非指针变量时不会报错: ```cpp int x = NULL; // 合法但逻辑错误 ``` - **nullptr**:强制类型安全,只能用于指针: ```cpp int x = nullptr; // 编译错误 ``` #### 4. **代码清晰度** - `nullptr`语义更明确,直接表示空指针,而`NULL`可能被误解为整型0。 #### 5. **兼容性与历史背景** - 在C++11之前,`NULL`的实现可能因编译器而异(如定义为`(void*)0`),但C++不允许`void*`到其他指针的隐式转换,因此统一为`0`[^1]。 - C++11后推荐使用`nullptr`,既兼容旧代码,又提高安全性[^2]。 #### 示例对比 ```cpp int* p1 = NULL; // 合法,但类型推导可能出问题 int* p2 = nullptr; // 合法且类型安全 if (p1 == 0) {} // 合法,但逻辑模糊 if (p2 == nullptr) {} // 明确检查空指针[^3] ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值