每日一问12:NULL和nullptr的区别

每日一问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表示整型常量。

参考博客:

  1. https://www.cnblogs.com/porter/p/3611718.html
  2. https://zhuanlan.zhihu.com/p/79883965
  3. https://www.jianshu.com/p/09e3b40929ad
posted @ 2021-01-12 10:14  浩楠honer  阅读(586)  评论(0编辑  收藏  举报