1.概述
NULL,0,nullptr值都是0,但是类型不同,但是由于C头文件中NULL定义宏混乱,可能是int 0,也可能是(void*)0;
所以在C++11及以后的标准中引入新的空指针nullptr,nullptr就是(void*)0,所以在C++中空指针统一用nullptr。
2.NULL的详细解释
NULL 实际是一个宏,在传统的 C 头文件 (stddef.h) 中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在 使用空值的指针时,都不可避免的会遇到一些麻烦;
利用函数重载证明NULL和0是是整形0,nullptr是(void*)0:
void f(int) {
qDebug() << "f(int)" ;
}
void f(int*) {
qDebug() << "f(int*)";
}
int main()
{
f(0); //调用了void f(int)
//f(NULL); //调用了void f(int) //QT6中调用出错
f(nullptr); //调用了void f(int*)
return 0;
}
3.nullptr说明
(1)在使用nullptr 表示指针空值时,不需要包含头文件,因为 nullptr 是 C++11 作为新关键字引入的 。
(2)在 C++11 中, sizeof(nullptr) 与 sizeof((void*)0) 所占的字节数相同。如:QT 64位编译程序为:8,8;QT 32位编译程序为:4,4
(3)为了提高代码的健壮性,在C++中表示指针空值时建议最好使用 nullptr 。