欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NULL ,nullptr,nullptr_t,0 区别

程序员文章站 2022-07-13 23:35:02
...

先看NULL的定义

#ifndef __cplusplus
#define NULL ((void *)0)
#else   /* C++ */
#define NULL 0

c语言中将NULL定义为空指针,而在c++中直接定义为0,这是因为C++是强类型的,void *是不能隐式转换成其他指针类型的。
既然NULL被定义成0,就存在二义性
c++ 中我们写这样一个函数 1

test(classA a,classB *pb);//函数1

我们可以这样调用

test(a,NULL);

没有问题,但是当我们重载这个函数2后,在做同样的调用

test(classA a,classB *pb);//函数1
test(classA a,int i);//函数2
test(a,NULL);//调用的是函数2

这个时候我们本来期望调用函数1,但是实际情况是调用了函数2。这就是NULL在C++中的二义性问题。c11提供了nullptr来解决这个问题,nullptr是一个关键字,表示一个空指针。

test(a,nullptr);//调用的是函数1

nulllptr_t为nullptr的类型

#if __cplusplus >= 201103L
  typedef decltype(nullptr) nullptr_t;
#endif

由nullptr_t定义的任何变量都具有nullptr一样的行为。

相关标签: c语言 nullptr