前言
在平时我们写C/C++代码时你可能会看到有人使用NULL表示空指针,也有人用nullptr表示空指针,那么你可能会很好奇它们都是空指针吗?为什么空指针有两种写法?下面就带你了解这背后的原理。
我们都知道NULL是C语言中的空指针,C++在大多数条件下是兼容C的,C++98及以前的空指针也都是用NULL表示,但是在C++11新特性中,我们用nullptr来表示指针空值,NULL仅仅只表示0。
C/C++中空指针NULL与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。
比