前言
在平时我们写C/C++代码时你可能会看到有人使用NULL表示空指针,也有人用nullptr表示空指针,那么你可能会很好奇它们都是空指针吗?为什么空指针有两种写法?下面就带你了解这背后的原理。
我们都知道NULL是C语言中的空指针,C++在大多数条件下是兼容C的,C++98及以前的空指针也都是用NULL表示,但是在C++11新特性中,我们用nullptr来表示指针空值,NULL仅仅只表示0。
C/C++中空指针NULL与nullptr
- 一、C/C++中NULL的定义实现
- 二、为什么要引入C++11要引入nullptr
一、C/C++中NULL的定义实现
在C语言中NULL的定义一般是:
#define NULL (void*)0
但同时,也允许将NULL定义为整常数0。
在C++11中NULL的定义是:
#ifndef NULL
#ifdef __cplusplus //如果是C++文件,那么都会有 __cplusplus 标志
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
这段代码翻译过来就是如果是C语言中,那么NULL就被定义为
#define NULL ((void *)0)
如果是C++中,那么NULL就被定义为
#define NULL 0
二、为什么要引入C++11要引入nullptr
要回答这个问题我们首先看一段代码
#include<iostream>
using namespace std;
void f(int)
{
cout << "f(int)" << endl;
}
void f(int*)
{
cout << "f(int*)" << endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
我们发现代码的第二行如果按照C++98的标准则是出现了奇怪情况,按照我们正常的想法f(0)应该进入void f (int),f(NULL)进入void f(int*),因此我们想要得到的结果是分别打印
f(int)
f(int*)
f(int*)
原因是 在C++98 中,字面常量 0 既可以是一个整形数字,也可以是无类型的指针 (void) 常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void )0 。
为了避免上述这个问题,C++11引入了nullptr关键字来表示指针空值。NULL只表示0;
注意:
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
- 在C++11中,sizeof(nullptr) 与 sizeof((void)0)所占的字节数相同。*
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
比