一、指针空值:NULL

在规范的C++编程习惯中,一般在定义指针变量的同时对指针进行初始化,为了避免野指针的产生,初始化时会让指针变量指向一个“空”的位置。
在C++11之前,初始化指针变量一般有两种方式:

 - int *p = 0;- int *p = NULL;

通过查看源代码可知NULL的定义如下:

#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif

代码通过条件编译定义了NULL在C语言和C++语言下的不同值,在C++语言程序中,NULL被定义为0,而在C程序中NULL被定义为 ((void *)0)。

问题来了,为什么NULL在C程序和C++程序分为不同的两种定义了?
在C++中,void*类型无法隐式的转换为其他的类型指针,此时定义NULL为0,也就解决了空指针的问题。

但随之而来了其他问题,比如说函数形参的二义性问题。举个例子,看看下面代码:

void func(int )
{cout << "func(int )" << endl;
}void func(char*)
{cout << "func(char*)" << endl;}int main()
{func(100);func(NULL);
}

我们首先定义两个函数,进行函数重载,接着我们在main函数中调用这些函数,第一个func函数我们传入“200”,第二个func函数我们传入“NULL”,第一感觉告诉我们,传入参数“200”调用“func(int)”这个函数版本,传入参数“NULL”调用“func(int*)”这个函数版本。可结果事与愿违,程序输出如下:

func(int)
func(int)

为什么会是这样的结果,为什么传入"NULL"参数调用的不是function(int*)这个函数呢?我们上面提到,才C++程序中,NULL被定义为0,就是说,计算机把用户传入的NULL参数当成了整数0来传值,理所当然也就时调用func(int)函数了

为题出现了,怎么解决?别急,继续往下看!

二、指针空值:nullptr

在C++11中,为了解决其中二义性的问题,C++11引入了新的关键字nullptr,nullptr专门被用来初始化空类型指针且可以被隐式的转为指针类型。

让我们来修改一下刚刚的main函数代码:

int main()
{func(100);func(nullptr);
}

在这里我们修改NULL为nullptr,再来打印输出一下:

func(int)
func(char*)

这里输出的结果符合我们的预期,通过nullptr,我们解决了上述问题中函数重载的二义性问题。

三、总结

nullptr是C++11带来的新的关键字,解决了NULL在C++程序中使用的弊端,使得代码变得健壮。在大部分请情况,C++的程序建议替换NULL用nullptr来初始化指针。

C++11之nullptr相关推荐

  1. C++11空指针(nullptr)

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105043059 C ...

  2. C++11中nullptr的使用

    在C语言中,NULL实际上是一个void* 的指针,然后把void* 指针赋值给其它类型的指针的时候,会隐式转换成相应的类型.而如果用一个C++编译器来编译的时候是要出错的,因为C++是强类型的,vo ...

  3. C++11中值得关注的几大变化 .

    Lambda 表达式 Lambda 表达式的形式是这样的: view plaincopy to clipboardprint? [capture](parameters)->return-typ ...

  4. NULL、0、nullptr的区别?

    NULL.0.nullptr 1.C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL; foo_t *f = NULL; 实际上在C语言中,N ...

  5. C++11中值得关注的几大变化

    赖勇浩(http://laiyonghao.com) 声明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的<The Biggest Changes in C++11( ...

  6. 如何选择指针中置空?NULL, nullptr, 0?

      在使用指针的时候,为了防止野指针,我们要对指针初始置空.以前一直使用*ptr = NULL,其中NULL和0是完全等价的.这就造成了一个潜在的危险,当我们将void f(int*)这个函数重定义一 ...

  7. c语言null和nullptr,nullptr和NULL

    nullptr是c++11中的关键字,表示空指针 要区分nullptr和NULL,首先要明白NULL的含义: NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中 ...

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

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

  9. c++11标准带来的最显著变化(及为何该引起你的注意)

    来源 :http://article.yeeyan.org/view/234235/250515 简介:自C++语言首次标准化以来,13年的时间过去了.前C++标准委员会成员, Danny Kalev ...

最新文章

  1. RNN情感分类问题实战
  2. 科研文献|中国的肠道微生物群及其与主食类型、民族和城市化的关系
  3. 高并发高负载网站的系统架构
  4. 配置electron
  5. System Center Operations Manager 简介 [SCOM中文系列之一]
  6. 解决ubuntu进行远程连接时出现密码认证失败的问题
  7. 【转】LiveWriter插入高亮代码插件介绍 基于SyntaxHighighter
  8. 史上最详细的F450四轴装机实例(无名官方推荐的)
  9. 华为ensp静态路由配置
  10. Windows常用快捷键
  11. PLC编程指南_变量命名规则介绍
  12. C语言之迷宫小游戏2.0版(随机生成地图,可变颜色,优化游戏体验)
  13. 血仍未冷——写在37岁生日
  14. Android Studio导入工程项目一直处于gradle....而且一直卡在这个页面
  15. 凯撒密码(还原明文)
  16. [Android] android 实现加速小火箭动画效果 位移+透明渐变 动画
  17. 【优化求解】基于Levy改进哈里斯鹰算法LHHO求解最优目标matlab代码
  18. caged系统pdf_介孔二氧化硅纳米粒子药物递送系统研究进展-中国药科大学学报!.PDF...
  19. sqli-lab代码审计
  20. 中科院水凝胶软体机器人实现越野爬行

热门文章

  1. windows10安装gradle
  2. linux的vi编辑器课件,Linux课件vi编辑器的使用.ppt
  3. 数钢筋的方法你真的知道吗
  4. 小心这种思维正在慢慢地吞噬掉你的前程
  5. mysql 事务 超时时间_设置事务超时时间的问题及数据库update和锁
  6. inverse java_Hibernate中的inverse的用法
  7. “嵌入式智能化”为医疗设备不断赋能
  8. 10月28号安全焦点DDOS事件背后内幕串串烧
  9. 侯捷老师-01面向对象高级编程
  10. CGAL#include<Nef_polyhedron_3>出现错误c2059,c2238