欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
}

这些都只是为了能更好的不同语言上的表达空指针,防止产生二义性。

参考博客

相关标签: 常见空指针区别