NULL,nullptr,0,(void*)0区别
程序员文章站
2022-03-07 16:01:07
...
序言
主要是了解空指针表达意思,以及C/C++/C++11在表达空指针上的区别。
正文
头文件 <stddef.h>
#if defined(__cplusplus)
#define NULL 0 // C++中使用0作为NULL的值
#else
#define NULL ((void *)0) // C中使用((void *)0)作为NULL的值
#endif
因为C语言中任何类型的指针都可以(隐式地)转换为void型,反过来也行,而C++中void型不能隐式地转换为别的类型指针(例如:intp = (void)0;使用C++编译器编译会报错)。
C语言中常数0和(void*)0都是空指针常量;C++中(暂且忽略C++11)常数0是,而(void*)0 不是
(int*) p = (void*) d; //编译不过 C++
(void*) d = (int*) p; //可以
考虑着这样一个函数重载的情形:
#include <stddef.h>
void foo(int) {} // 1
void foo(char*) {} // 2
int main() {
foo(NULL); // 实际上调用1
}
从字面上来讲,NULL是个空指针常量,我们可能会觉得:既然是个指针,那么应该调用。但事实上调用的却是1,因为C++中NULL扩展为常数0,它是int型。
根本原因就是:常数0既是整数常量,也是空指针常量。
为了解决这种二义性,C++11标准引入了关键字nullptr,它作为一种空指针常量.例如:
void foo(int) {} // #1
void foo(char*) {} // #2
int main() {
foo(nullptr); // 它会毫无异议地调用#2
}
这些都只是为了能更好的不同语言上的表达空指针,防止产生二义性。
下一篇: 面试常问之JavaScript变量提升
推荐阅读
-
selenium python虚拟点击网页 爬虫翻页功能 href=javascript:void(0)怎么翻页
-
PHP中空字符串介绍0、null、empty和false之间的关系
-
浅谈href=#与href=javascript:void(0)的区别
-
在javascript中,null>=0 为真,null==0却为假,null的值详解
-
border:none与border:0使用区别
-
javascript:void(0)的含义
-
为了防止页面重新自动加载,可以给a标签设置href="javascript:void(0);"
-
为何JS操作的href都是javascript:void(0);呢
-
Item8 Prefer nullptr to 0 and NULL
-
shell 中 exit0 exit1 的区别