如何做网站价格策略,网站底部菜单,qq企业邮箱怎么申请,红酒网站建设C 11 nullptr关键字
转载#xff1a;https://www.cnblogs.com/DswCnblog/p/5629073.html
熟悉C的童鞋都知道#xff0c;为了避免“野指针”#xff08;即指针在首次使用之前没有进行初始化#xff09;的出现#xff0c;我们声明一个指针后最好马上对其进行初始化操作。如… C 11 nullptr关键字
转载https://www.cnblogs.com/DswCnblog/p/5629073.html
熟悉C的童鞋都知道为了避免“野指针”即指针在首次使用之前没有进行初始化的出现我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量则需要赋予NULL值。除了NULL之外C11新标准中又引入了nullptr来声明一个“空指针”这样我们就有下面三种方法来获取一个“空指针”
如下
int *p1 NULL; // 需要引入cstdlib头文件
int *p2 0;
int *p3 nullptr;
新标准中建议使用nullptr代替NULL来声明空指针。到这里大家心里有没有疑问为什么C11要引入nullptr它与NULL相比又有什么不同呢这就是我们今天要解决的问题。
C/C中的NULL到底是什么
我们查看一下C和C的源码不难发现
1.NULL在C中的定义NULL在C中被明确定义为整数0
/* Define NULL pointer value */
#ifndef NULL#ifdef __cplusplus#define NULL 0#else /* __cplusplus */#define NULL ((void *)0)#endif /* __cplusplus */
#endif /* NULL */
2.NULL在C中的定义.在C中NULL通常被定义为如下
#define NULL ((void *)0)
也就是说NULL实质上是一个void *指针。
那么问题又来了我们从一开始学习C的时候就被告诫C是兼容C的为什么对于NULLC却不完全兼容C呢通过查找维基百科才发现这其中的原因。
简单地说C之所以做出这样的选择根本原因和C的函数重载机制有关。考虑下面这段代码 void Func(char *);
void Func(int);int main()
{Func(NULL);
}
如果C让NULL也支持void *的隐式类型转换这样编译器就不知道应该调用哪一个函数。
为什么要引入nullptr
C把NULL定义为0解决了函数重载后的函数匹配问题但是又引入了另一个“问题”同样是上面这段代码
void Func(char *);
void Func(int);int main()
{Func(NULL); // 调用Func(int)
}
由于我们经常使用NULL表示空指针所以从程序员的角度来看FuncNULL应该调用的是Funcchar *但实际上NULL的值是0所以调用了Funcint。nullptr关键字真是为了解决这个问题而引入的。
另外我们还有注意到NULL只是一个宏定义而nullptr是一个C关键字。
nullptr如何使用
nullptr关键字用于标识空指针是std::nullptr_t类型的constexpr变量。它可以转换成任何指针类型和bool布尔类型主要是为了兼容普通指针可以作为条件判断语句的写法但是不能被转换为整数。
char *p1 nullptr; // 正确
int *p2 nullptr; // 正确
bool b nullptr; // 正确. if(b)判断为false
int a nullptr; // error