在阅读李同学(看不懂啊啊啊啊啊)的代码时,发现李同学空指针不是用NULL而是用nullptr,于是好奇啊好奇,有啥区别捏?

打开scdn 找到了个能看懂的

nullptr的出现是为了解决NULL表示空指针在C++中具有二义性的问题。

C中,NULL通常被定义为:

#denfine NULL((void*)0)

所以说NULL实际上是一个空指针,如果在C语言中写下以下代码,编译无问题

int* i=NULL;

char* pc=NULL;

因为C语言中把空指针赋给int和char指针的时候,发生了隐式类型转换,把void指针转换成了相应类型的指针。

但是C++是强制型语言,void*是不能隐式转换成其他类型指针的,所以编译器提供的头文件做了相应类型的处理:

#ifdef _cplusplus

#define NULL 0

#else

#define NULL((void*)0)

#endif

可见,C++中 NULL实际是0,因为C++中不能把void*类型的指针隐式转换成其他类型的指针,所以为了结果空指针的表示问题,引入了0表示空指针

但是实际上,用NULL代替0表示空指针在函数重载时会出现问题,如下:

#include<iostream>

using namespace std;

void func(void* i)

{

cout<<”func1”<endl;

}

void func(int i)

{

cout<<”func2”<<endl;

}

void main(int argc, char* argv[])

{

func(NULL);

func(nullptr);

getchar();

}

结果为:

func2

func1

这段代码我们对函数func进行重载,参数分别是void*类型和int类型,但是运行结果却与我们使用NULL的初衷是相违背的,因为我们本来是想用NULL代表空指针,但是在将NULL输入到函数中,他却选择了int形参这个函数版本。所以是有问题的,这就是NULL代替空指针在C++中的二义性。

总结:

NULL在C++中就是0,建议以后还是都用nullptr表示空指针,而NULL就当0用。

学习来源:https://blog.csdn.net/qq_18108083/article/details/84346655?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-84346655-blog-51249555.pc_relevant_multi_platform_whitelistv5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-84346655-blog-51249555.pc_relevant_multi_platform_whitelistv5&utm_relevant_index=16

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. NULL与nullptr

    传统意义上来说,c++把NULL.0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0. c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为 ( ...

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

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

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

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

最新文章

  1. 50位全球专家畅谈人工智能治理进程——结伴前行,合作共赢(附下载)
  2. 机器人 陆梅东_机器人知识与实践比赛获奖 - 上海徐汇区青少年活动中心
  3. 如何确定SharePoint 2007的一次增量爬网会处理多少条更新呢?
  4. JavaScript核心参考手册.chm
  5. Eclipse 安装配置指南
  6. Leetcode 6.Z 字形变换 (每日一题 20210630)
  7. 十分钟快速了解 ES6 Promise
  8. MySQL、MongoDB、列数据库的区别及应用场景
  9. Coursera自动驾驶课程第10讲:Feedforward Neural Networks
  10. Oracle PL/SQL块 多表查询(emp员工表、dept部门表、salgrade工资等级表)
  11. Mongodb定时备份脚本和清除脚本
  12. 一张图带你了解-常见面试之JUC包详解
  13. Vue计算属性的_set与get方法_实现双向数据传递---vue工作笔记0006
  14. lambdapython语法_Python中lambda表达式的语法与应用
  15. linux+读取初始化文件,Linux 初始化系统 SystemV Upstart
  16. 选择物联网卡平台时需要重点考虑的标准
  17. 科技部领衔发布中国新一代AI发展报告:中美成全球AI网络核心节点
  18. 华为发布鸿蒙Beta版公测,华为推出鸿蒙OS 2.0手机开发者Beta版:P40、Mate 30系列可申请公测...
  19. codeforces1299B Aerodynamic
  20. 在 AWS上域名备案流程和文件

热门文章

  1. 手机学python之安装pydroid3
  2. 手机办公总被质疑效率低?合理地使用手机功能,办公效率远超电脑
  3. mysql 字段类型说明
  4. 第二十五章 摄像保存示例
  5. 硬盘恢复数据可以百分百恢复吗?怎么提高文件恢复率
  6. 2023自助洗车店系统解决方案共享洗车无人洗车风口
  7. 结构体初始化的几种方法
  8. 剪刀石头布java_Java简化实现石头剪刀布游戏
  9. Css定制Drupal主题风格
  10. DRF框架知识点总结