参考博客:https://blog.csdn.net/u010983763/article/details/53667468

1. 引入nullptr的原因

引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。

1.1 NULL在C中的定义

在C中,习惯将NULL定义为void*指针值0:

[cpp] view plain copy

  1. #define NULL (void*)0

但同时,也允许将NULL定义为整常数0

1.2 NULL在C++中的定义

在C++中,NULL却被明确定义为整常数0:

[cpp] view plain copy

  1. // lmcons.h中定义NULL的源码
  2. #ifndef NULL
  3. #ifdef __cplusplus
  4. #define NULL    0
  5. #else
  6. #define NULL    ((void *)0)
  7. #endif
  8. #endif

1.3为什么C++在NULL上选择不完全兼容C?

根本原因和C++的重载函数有关。C++通过搜索匹配参数的机制,试图找到最佳匹配(best-match)的函数,而如果继续支持void*的隐式类型转换,则会带来语义二义性(syntax ambiguous)的问题。

下面参考博客:https://blog.csdn.net/weixin_40237626/article/details/82560012

在过去,我们如果要表示一个指针为空,我们条件反射肯定会这么写:

int *p = NULL;

然而啊,有没有想过这是有问题的,比如下面的这段代码:

  1. #include <iostream>

  2. #include <string>

  3. using namespace std;

  4. void func(int* num)

  5. {

  6. cout << "this is the ptr function..." << endl;

  7. }

  8. void func(int num)

  9. {

  10. cout << "this is the normal function..." << endl;

  11. }

  12. void main(int argc, char** argv)

  13. {

  14. func(NULL);

  15. }

程序会输出什么??笔者问了好多人,他们一致的回答就是:输出this is the ptr function…啊,还不忘带一句嘲讽。其实啊,这里输出的是: 

其实啊,在编译器进行解释程序时,NULL会被直接解释成0,所以这里的参数根本就不是大家所想的NULL,参数已经被编译器偷偷换成了0,0是整数啊,所以调用的是第二个函数。所以一些编程大师也建议将NULL换成0,这样可以减少后期维护的困难。但是我要怎么调用第一个函数呢?网上有很多解决办法(大多是利用之前的标准写的)。

C++11的出现彻底解决了这个问题,nullptr在C++11中就是代表空指针,不能被转换成数字(具体底层是怎么实现的,大家可以看看API,笔者表示看不大懂 T_T),那么我们再试试,看这次的结果是什么? 

怎么样,看到结果了吧。

NULL 与 nullptr区别与联系相关推荐

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

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

  2. NULL 和nullptr

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

  3. [C++] NULL VS nullptr

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

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

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

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

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

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

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

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

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

  8. C语言 NULL 和 0 区别 - C语言零基础入门教程

    目录 一.关于 NULL 定义 二.NULL 和 0 区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.关于 NULL 定义 NU ...

  9. java null和 的区别_java中null和的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  10. JAVA中isEmpty、null、的区别

    JAVA中isEmpty.null.""的区别 isEmpty()         分配了内存空间,值为空,是绝对的空,是一种有值(值 = 空)    ""   ...

最新文章

  1. java工具类去掉字符串String中的.点。android开发java程序员常用工具类
  2. BZOJ2822 [AHOI2012]树屋阶梯
  3. php 阻塞消息队列,linux 消息队列阻塞
  4. 推荐 9 个爱不释手的 JSON 工具
  5. laravel如何生成swagger接口文档
  6. PE格式学习讨论群:3214720
  7. 42 FI配置-财务会计-固定资产-组织结构-将折旧表分配至公司代码
  8. axure 怎么看距离_AXURE 怎么获取当天日期,并计算该日期距离年底还有多少天?...
  9. oracle gg 有两个字段没同步到,GG配置Oracle同步到SQLServer
  10. 面试遇到职场PUA,只能说兄弟你还嫩了点
  11. hdu3787 A+B
  12. 从几何解释SVD分解
  13. 【电路仿真】基于matlab Simulink光伏太阳能电池板仿真模型【含Matlab源码 771期】
  14. centos7通过阿里云配置docker加速镜像
  15. ArcView GIS 应用与开发技术(2)-Tables
  16. UE4官方文档UI学习:7. UMG 用事件驱动UI更新
  17. matlab中pwm占空比计算代码,详解STM32的PWM输出及频率和脉宽(占空比)的计算
  18. css黄金色渐变值,金色的rgb值是多少
  19. Numpy 学习笔记 ——IndexingSlicing 几点心得
  20. OpenJudge NOI 1.13 42:出书最多

热门文章

  1. unity通过脚本获取一个物体的所有子物体孙子物体.....并从里面找到有动画的物体
  2. Atitit 项目分析与统计目录1. 静态分析+动态分析 。其中, 12. 模块分析,与模块位置idx 13. 编程语言类型与版本 13.1. 类库统记表 类型与版本 23.2. 中间
  3. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
  4. 日志记录总结要整理的地方
  5. 人力资源SaaS“一哥”,二十年艰难进化
  6. 恒生电子:O45好在哪儿(深度)| 国君计算机李沐华
  7. Julia : DataFrame常见用法
  8. (转)财新特稿丨风口浪尖上,李笑来谈ICO
  9. Julia : The Power Sum的算法
  10. 从心理学角度看,如何通过故事影响客户的决策?