NULL与nullptr
传统意义上来说,c++把NULL、0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0.
c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为 ((void*)0),
当编译char *p = NULL;
NULL只好被定义为0。
还有:
void func(int);
void func(char*);
如果NULL被定义为0,func(NULL)会去调用void func(int),这是不合理的
所以引入nullptr,专门用来区分0、NULL。
nullptr的类型为nullptr_t,能够隐式的转换为任何指针。
所以用空指针就尽可能的使用nullptr。
为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:
int *p1 = NULL; // 需要引入cstdlib头文件
int *p2 = 0;
int *p3 = nullptr;
新标准中建议使用nullptr代替NULL来声明空指针。到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?这就是我们今天要解决的问题。
1.C/C++中的NULL到底是什么
1.NULL在C++中的定义
NULL在C++中被明确定义为整数0:
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */12345678
NULL在C中的定义
在C中,NULL通常被定义为如下:
#define NULL ((void *)0)1
也就是说NULL实质上是一个void *指针。
那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。
简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。考虑下面这段代码:
void Func(char *);
void Func(int);
int main()
{
Func(NULL);
}1234567
如果C++让NULL也支持void *的隐式类型转换,这样编译器就不知道应该调用哪一个函数。
2.为什么要引入nullptr
C++把NULL定义为0,解决了函数重载后的函数匹配问题,但是又引入了另一个“问题”,同样是上面这段代码:
void Func(char *);
void Func(int);
int main()
{
Func(NULL); // 调用Func(int)
}1234567
由于我们经常使用NULL表示空指针,所以从程序员的角度来看,Func(NULL)应该调用的是Func(char *)但实际上NULL的值是0,所以调用了Func(int)。nullptr关键字真是为了解决这个问题而引入的。
另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。
3.nullptr如何使用
nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。
char *p1 = nullptr; // 正确
int *p2 = nullptr; // 正确
bool b = nullptr; // 正确. if(b)判断为false
int a = nullptr; // error
NULL与nullptr相关推荐
- [C++] NULL VS nullptr
NULL VS nullptr 转载于:https://www.cnblogs.com/tianhangzhang/p/4945623.html
- iOS开发-NULL和nullptr和nil和Nil还有NSNull
2019独角兽企业重金招聘Python工程师标准>>> NULL和nullptr 在Clang 6.0 的stddef.h文件中可以找到NULL和nullptr的声明: 1 2 3 ...
- INVALID_HANDLE_VALUE 、 NULL、nullptr 和 nullptr_t 的联系
--------------------------------------------- -- 时间:2018-12-26 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...
- const对象,NULL和nullptr,C++中创建对象数组
1.定义成了const之后的类 #include <iostream> class area { public:int x;int y;mutable int z; //不受cons ...
- c++11编码规范 NULL还是nullptr
0和nullptr/NULL 至于指针(地址值),根据实际选择用0.NULL还是nullptr.对使用了C++11特性的项目,选用nullptr:对于C++03项目,推荐NULL,因为它像是一个指针 ...
- C++11标准之NULL与nullptr比较
C++标准之NULL与nullptr比较 随着C++11标准的出现,C++的规范也越来越严谨,在减少语言二义性上,C++委员会确实做了很多努力. 在过去,我们如果要表示一个指针为空,我们条件反射肯定会 ...
- C语言-7月22日- NULL和nullptr的深入了解以及VScode对nullptr语句报错问题的解决
目录 指针的非空判断问题: NULL和nullptr的替换问题: 这里我对于NULL的二义性问题有两个理解: 总结:如果你的编译器支持nullptr的话,尽量选择去使用nullptr而不是NULL. ...
- C++中NULL和nullptr的区别
在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有 ...
- NULL 和nullptr
在阅读李同学(看不懂啊啊啊啊啊)的代码时,发现李同学空指针不是用NULL而是用nullptr,于是好奇啊好奇,有啥区别捏? 打开scdn 找到了个能看懂的 nullptr的出现是为了解决NULL表示空 ...
最新文章
- 4.4学习笔记-REGEXP1(正则表达式)
- mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
- php xml expat,PHP 使用 XML Expat 解释xml文件
- android 微信登录点击没翻译,[android] 微信登录,没有唤起微信,直接返回ERR_AUTH_DENIED...
- AndroidStudio安卓原生开发_Android扫描附近指定的蓝牙设备_通过设备名称过滤_计算距离_离扫描设备近的显示的时候放在前面---Android原生开发工作笔记128
- java 1.5 代替for循环_J2EE 1.5 提供的另一种形式的for循环
- 程序员的自我修养—链接、装载与库pdf
- (11)数据分析-TableOne工具
- roseha文件服务器,双机热备软件Rose HA日常维护技巧
- 调试笔记:BSOD 0xA
- 带头结点的单链表的创建(头插法和尾插法)
- 【学习笔记】通过雷达获取某一角度的距离信息
- Linux下固态硬盘坏块修复,固态硬盘如果发现坏块就完蛋了
- 引用防删——JAVA设计模式总结之六大设计原则
- UVa 10036 - Divisibility
- median函数 oracle9i,oracle10g学习笔记
- STM32 UART DMA实现未知数据长度接收(转自amoBBs)
- 手写一个迷你版的 Tomcat 喵
- 转 基于MySQL MEB的备份恢复
- Spring的constructor-arg 与property注入
热门文章
- 电脑xp系统坏了,如何处理
- 经济学术语解析(一)
- 中国矿业大学计算机学院评优,活动回顾 | 中国矿业大学院研究生会评优工作圆满结束...
- LightOJ 1079	Just another Robbery
- 【Error response from daemon: mkdir /var/lib/docker/overlay2/413d0090b35b07401e25a5cc80538da5b43f6a9】
- 苏宁图书spider
- 回顾去哪儿的这些年,最让我骄傲的是收获了这9点管理心得
- 乔布斯的创新之道:换一种思考方式
- 前端动画——网页时钟
- 第10章 数据库恢复技术 | 数据库知识点整理