传统意义上来说,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相关推荐

  1. [C++] NULL VS nullptr

    NULL VS nullptr 转载于:https://www.cnblogs.com/tianhangzhang/p/4945623.html

  2. iOS开发-NULL和nullptr和nil和Nil还有NSNull

    2019独角兽企业重金招聘Python工程师标准>>> NULL和nullptr 在Clang 6.0 的stddef.h文件中可以找到NULL和nullptr的声明: 1 2 3 ...

  3. INVALID_HANDLE_VALUE 、 NULL、nullptr 和 nullptr_t 的联系

    --------------------------------------------- -- 时间:2018-12-26 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  4. const对象,NULL和nullptr,C++中创建对象数组

     1.定义成了const之后的类 #include <iostream> class area { public:int x;int y;mutable int z; //不受cons ...

  5. c++11编码规范 NULL还是nullptr

    0和nullptr/NULL 至于指针(地址值),根据实际选择用0.NULL还是nullptr.对使用了C++11特性的项目,选用nullptr:对于C++03项目,推荐NULL,因为它像是一个指针 ...

  6. C++11标准之NULL与nullptr比较

    C++标准之NULL与nullptr比较 随着C++11标准的出现,C++的规范也越来越严谨,在减少语言二义性上,C++委员会确实做了很多努力. 在过去,我们如果要表示一个指针为空,我们条件反射肯定会 ...

  7. C语言-7月22日- NULL和nullptr的深入了解以及VScode对nullptr语句报错问题的解决

    目录 指针的非空判断问题: NULL和nullptr的替换问题: 这里我对于NULL的二义性问题有两个理解: 总结:如果你的编译器支持nullptr的话,尽量选择去使用nullptr而不是NULL. ...

  8. C++中NULL和nullptr的区别

    在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有 ...

  9. NULL 和nullptr

    在阅读李同学(看不懂啊啊啊啊啊)的代码时,发现李同学空指针不是用NULL而是用nullptr,于是好奇啊好奇,有啥区别捏? 打开scdn 找到了个能看懂的 nullptr的出现是为了解决NULL表示空 ...

最新文章

  1. 4.4学习笔记-REGEXP1(正则表达式)
  2. mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
  3. php xml expat,PHP 使用 XML Expat 解释xml文件
  4. android 微信登录点击没翻译,[android] 微信登录,没有唤起微信,直接返回ERR_AUTH_DENIED...
  5. AndroidStudio安卓原生开发_Android扫描附近指定的蓝牙设备_通过设备名称过滤_计算距离_离扫描设备近的显示的时候放在前面---Android原生开发工作笔记128
  6. java 1.5 代替for循环_J2EE 1.5 提供的另一种形式的for循环
  7. 程序员的自我修养—链接、装载与库pdf
  8. (11)数据分析-TableOne工具
  9. roseha文件服务器,双机热备软件Rose HA日常维护技巧
  10. 调试笔记:BSOD 0xA
  11. 带头结点的单链表的创建(头插法和尾插法)
  12. 【学习笔记】通过雷达获取某一角度的距离信息
  13. Linux下固态硬盘坏块修复,固态硬盘如果发现坏块就完蛋了
  14. 引用防删——JAVA设计模式总结之六大设计原则
  15. UVa 10036 - Divisibility
  16. median函数 oracle9i,oracle10g学习笔记
  17. STM32 UART DMA实现未知数据长度接收(转自amoBBs)
  18. 手写一个迷你版的 Tomcat 喵
  19. 转 基于MySQL MEB的备份恢复
  20. Spring的constructor-arg 与property注入

热门文章

  1. 电脑xp系统坏了,如何处理
  2. 经济学术语解析(一)
  3. 中国矿业大学计算机学院评优,活动回顾 | 中国矿业大学院研究生会评优工作圆满结束...
  4. LightOJ 1079 Just another Robbery
  5. 【Error response from daemon: mkdir /var/lib/docker/overlay2/413d0090b35b07401e25a5cc80538da5b43f6a9】
  6. 苏宁图书spider
  7. 回顾去哪儿的这些年,最让我骄傲的是收获了这9点管理心得
  8. 乔布斯的创新之道:换一种思考方式
  9. 前端动画——网页时钟
  10. 第10章 数据库恢复技术 | 数据库知识点整理