1. 定义:
在C语言中和C++中定义是不同的。相关代码如下:
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
为什么在C中和C++中的定义是不一样的呢?原因如下:
在C语言中,看定义就好理解,直接定义为空指针。(此处也得声明一下,本质上0并非是空的含义,只是这样定义在解引用的时候相当于是访问0x00000000地址,而对于一般而言,0地址通常是不可访问的)。
而对于C++而言。因为C++中不能将void *类型的指针隐式转换成其他指针类型。但是0可以。所以不能将NULL定义为(void*)0,而定义为了0。
2. C++11标准中出现的nullptr
在C++中虽然将NULL定义为了0,但是有时候又特别容易出错。例子如下:
#include<iostream>
using namespace std;
void test(void *p)
{
cout<<"p is pointer "<<p<<endl;
}
void test(int num)
{
cout<<"num is int "<<num<<endl;
}
int main(void)
{
test(NULL);
return 0;
}
在这个示例中,test函数重载,但是NULL本质上是0,导致重载出现二义性。理论上两个函数定义都可以匹配。因此,为了解决这个问题,在C++11标准中,引入了nullptr的关键字。
test(nullptr);
则可以有效的解决这个问题。因此在C++中, 如果要表达空指针,则最好使用nullptr关键字。