每日一问12:NULL和nullptr的区别
C中的NULL和C++中的NULL
在C中,NULL表示空指针,而在C++中,NULL就是整型0。它们各自的定义如下:
//C
#define NULL ((void*)0)
//C++
#define NULL 0
在C中,NULL是一个void *的指针,使用void*给其他指针赋值时,会隐式转换成相应的类型。而在C++编译器中来编译的话是要出错的,因为C++是强类型的,void *是不能隐式转换成其他指针类型的,除非使用强制转换。为了解决空指针的问题,C++中引入了0来表示空指针。
#ifdef __cplusplus ---简称:cpp c++ 文件
#define NULL 0
#else
#define NULL ((void *)0)
#endif
int *i = ((void*) 0); //C中正确,C++中不正确
int *j = NULL; //C和C++中都正确,但是具体的细节不同
但是在C++中,不建议使用NULL来替代0表示空指针,因为0不仅是一个空指针,同时也是一个整型常量。如下:
//运行环境 Visual Studio 2019
void func(int a)
{
cout<<"int a"<<endl;
}
void func(int* a)
{
cout<<"int* a"<<endl;
}
int main()
{
func(NULL); //调用第一个重载函数
func(0); //调用第一个重载函数
func(static_cast<int*>(0)); //调用第二个重载函数
func(nullptr); //调用第二个重载函数
}
C++ 中的nullptr
nullptr是C++11引入的关键字,表示空指针,使用nullptr代表指针就消除了C++中,NULL和0的二义性。所以在C++11及以上的版本中,尽量使用nullptr表示空指针,0表示整型常量。
参考博客: