lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
C++中NULL和nullptr
2019-04-22 22:54:46
446
0
0
lee-romantic
这里主要整理下`NULL`和`nullptr`的相关内容,注意:C++中没有`null`!!! 某些时候,我们需要将指针赋值为空指针,以防止野指针,在博客《为何新建的指针要设为NULL》也有讲到。 有人喜欢使用`NULL`作为空指针常量使用,例如: `int* p = NULL;`。 也有人直接使用0值作为空指针常量,例如: `int* p = 0`; C++11后,引入了`nullptr`,因此还可以这样写: `int *p =nullptr`; 那么,它究竟有多大区别? ###什么是`NULL`? `NULL`作为空指针常量,名字很形象,可读性较强。`NULL`并不是C/C++语言的关键字,而是定义在头文件中的宏,比如头文件:`vcruntime.h`,中是这么定义的: ``` #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif ``` `NULL`是一个宏,它的值是一个空指针常量(null pointer constant),由实现定义。C语言中常数0和(void*)0都是空指针常量;C++中(暂且忽略C++11)常数0是,而(void*)0 不是。 ###为什么C中`(void*)0`是空指针常量,而C++中不是? 因为C语言中任何类型的指针都可以(隐式地)转换为`void*`型,反过来也行,而C++中`void*`型不能隐式地转换为别的类型指针(例如:`int*p = (void*)0`;使用C++编译器编译会报错),C++中,其他类型的指针可以转为`void*`型指针,只是反之不行。 ###既然C/C++标准中,常数0都可作为空指针常量,为什么不统一使用0? 答:个人觉得由于(void*)0更能体现指针的意义,而常数0更多的时候是用作整数。因此,C语言中NULL定义选择了(void*)0。(仅供参考) ###C++11中为什么要引入nullptr? 考虑着这样一个函数重载的情形: ``` #include <stddef.h> void foo(int) {} // #1 void foo(char*) {} // #2 int main() { foo(NULL); // 调用#1还是#2? } ``` 从字面上来讲,NULL是个空指针常量,我们可能会觉得:既然是个指针,那么应该调用#2。但事实上调用的却是#1,因为C++中NULL扩展为常数0,它是int型。 根本原因就是:`常数0既是整数常量,也是空指针常量`。 为了解决这种二义性,C++11标准引入了关键字`nullptr`,将它作为一种空指针常量。 ``` void foo(int) {} // #1 void foo(char*) {} // #2 int main() { foo(nullptr); // 它会毫无异议地调用#2 } ``` ###总结: c++是由C发展而来的,C中,0和(void*)0均作为空指针常量,都可以用来给空指针初始化,C++中`void*`型指针不可以转化成其他类型的指针,如下: ``` int*p ; void* hh;// = (void*)0; //p = hh;//会提示“void*”类型的值不能初始化“int*”类型的实体 p=(int*)hh;//强制转换下即可 ``` 因此只好使用常量0作为空指针常量,但是常量0不直观,于是有了`NULL`的宏定义。但是后来呢,由于C++函数重载的需要(`0`和`NULL`都被重载为整型),又引入了`nullptr`.C一般认为是不可以重载的(要重载,只能用指针的特殊方式重载,不是真正的重载),因此C中不考虑这么多. 由以上可以看出,通常情况下,常量0(普通的int型的0不行),`NULL`,`nullptr`是可以通用的,比如在C++编译器中,: ``` int *a = new int; int *b = new int; delete a; a = NULL; b = nullptr; if (a==b) { cout << "a和b是同类型指针!!!"; } ```
上一篇:
C++中NULL指针引发的一个小问题
下一篇:
numpy中数组索引(包括高级用法)
0
赞
446 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册