网站建设中模板,织梦如何做英文网站,甘肃省建设厅注册中心网站,网络建站平台前言 在平时我们写C/C代码时你可能会看到有人使用NULL表示空指针#xff0c;也有人用nullptr表示空指针#xff0c;那么你可能会很好奇它们都是空指针吗#xff1f;为什么空指针有两种写法#xff1f;下面就带你了解这背后的原理。 我们都知道NULL是C语言中的空指针#x…前言 在平时我们写C/C代码时你可能会看到有人使用NULL表示空指针也有人用nullptr表示空指针那么你可能会很好奇它们都是空指针吗为什么空指针有两种写法下面就带你了解这背后的原理。 我们都知道NULL是C语言中的空指针C在大多数条件下是兼容C的C98及以前的空指针也都是用NULL表示但是在C11新特性中我们用nullptr来表示指针空值NULL仅仅只表示0。 C/C中空指针NULL与nullptr一、C/C中NULL的定义实现二、为什么要引入C11要引入nullptr一、C/C中NULL的定义实现
在C语言中NULL的定义一般是
#define NULL (void*)0 但同时也允许将NULL定义为整常数0。
在C11中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二、为什么要引入C11要引入nullptr
要回答这个问题我们首先看一段代码
#includeiostream
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;
} 我们发现代码的第二行如果按照C98的标准则是出现了奇怪情况按照我们正常的想法f(0)应该进入void f (int)f(NULL)进入void f(int*)因此我们想要得到的结果是分别打印 f(int) f(int*) f(int*) 原因是 在C98 中字面常量 0 既可以是一个整形数字也可以是无类型的指针 (void) 常量但是编译器默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void )0 。
为了避免上述这个问题C11引入了nullptr关键字来表示指针空值。NULL只表示0
注意
在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入的。在C11中sizeof(nullptr) 与 sizeof((void)0)所占的字节数相同。*为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。 比