NULL 与 nullptr区别与联系
参考博客: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
- #define NULL (void*)0
但同时,也允许将NULL定义为整常数0
1.2 NULL在C++中的定义
在C++中,NULL却被明确定义为整常数0:
[cpp] view plain copy
- // lmcons.h中定义NULL的源码
- #ifndef NULL
- #ifdef __cplusplus
- #define NULL 0
- #else
- #define NULL ((void *)0)
- #endif
- #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;
#include <iostream>
#include <string>
using namespace std;
void func(int* num)
{
cout << "this is the ptr function..." << endl;
}
void func(int num)
{
cout << "this is the normal function..." << endl;
}
void main(int argc, char** argv)
{
func(NULL);
}
程序会输出什么??笔者问了好多人,他们一致的回答就是:输出this is the ptr function…啊,还不忘带一句嘲讽。其实啊,这里输出的是:
其实啊,在编译器进行解释程序时,NULL会被直接解释成0,所以这里的参数根本就不是大家所想的NULL,参数已经被编译器偷偷换成了0,0是整数啊,所以调用的是第二个函数。所以一些编程大师也建议将NULL换成0,这样可以减少后期维护的困难。但是我要怎么调用第一个函数呢?网上有很多解决办法(大多是利用之前的标准写的)。
C++11的出现彻底解决了这个问题,nullptr在C++11中就是代表空指针,不能被转换成数字(具体底层是怎么实现的,大家可以看看API,笔者表示看不大懂 T_T),那么我们再试试,看这次的结果是什么?
怎么样,看到结果了吧。
NULL 与 nullptr区别与联系相关推荐
- C++中NULL和nullptr的区别
在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有 ...
- NULL 和nullptr
在阅读李同学(看不懂啊啊啊啊啊)的代码时,发现李同学空指针不是用NULL而是用nullptr,于是好奇啊好奇,有啥区别捏? 打开scdn 找到了个能看懂的 nullptr的出现是为了解决NULL表示空 ...
- [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语言 NULL 和 0 区别 - C语言零基础入门教程
目录 一.关于 NULL 定义 二.NULL 和 0 区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.关于 NULL 定义 NU ...
- java null和 的区别_java中null和的区别
null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...
- JAVA中isEmpty、null、的区别
JAVA中isEmpty.null.""的区别 isEmpty() 分配了内存空间,值为空,是绝对的空,是一种有值(值 = 空) "" ...
最新文章
- java工具类去掉字符串String中的.点。android开发java程序员常用工具类
- BZOJ2822 [AHOI2012]树屋阶梯
- php 阻塞消息队列,linux 消息队列阻塞
- 推荐 9 个爱不释手的 JSON 工具
- laravel如何生成swagger接口文档
- PE格式学习讨论群:3214720
- 42 FI配置-财务会计-固定资产-组织结构-将折旧表分配至公司代码
- axure 怎么看距离_AXURE 怎么获取当天日期,并计算该日期距离年底还有多少天?...
- oracle gg 有两个字段没同步到,GG配置Oracle同步到SQLServer
- 面试遇到职场PUA,只能说兄弟你还嫩了点
- hdu3787 A+B
- 从几何解释SVD分解
- 【电路仿真】基于matlab Simulink光伏太阳能电池板仿真模型【含Matlab源码 771期】
- centos7通过阿里云配置docker加速镜像
- ArcView GIS 应用与开发技术(2)-Tables
- UE4官方文档UI学习:7. UMG 用事件驱动UI更新
- matlab中pwm占空比计算代码,详解STM32的PWM输出及频率和脉宽(占空比)的计算
- css黄金色渐变值,金色的rgb值是多少
- Numpy 学习笔记 ——IndexingSlicing 几点心得
- OpenJudge NOI 1.13 42:出书最多
热门文章
- unity通过脚本获取一个物体的所有子物体孙子物体.....并从里面找到有动画的物体
- Atitit 项目分析与统计目录1. 静态分析+动态分析 。其中, 12. 模块分析,与模块位置idx 13. 编程语言类型与版本 13.1. 类库统记表 类型与版本 23.2. 中间
- Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
- 日志记录总结要整理的地方
- 人力资源SaaS“一哥”,二十年艰难进化
- 恒生电子:O45好在哪儿(深度)| 国君计算机李沐华
- Julia : DataFrame常见用法
- (转)财新特稿丨风口浪尖上,李笑来谈ICO
- Julia : The Power Sum的算法
- 从心理学角度看,如何通过故事影响客户的决策?