在阅读李同学(看不懂啊啊啊啊啊)的代码时,发现李同学空指针不是用NULL而是用nullptr,于是好奇啊好奇,有啥区别捏?
打开scdn 找到了个能看懂的
nullptr的出现是为了解决NULL表示空指针在C++中具有二义性的问题。
C中,NULL通常被定义为:
#denfine NULL((void*)0)
所以说NULL实际上是一个空指针,如果在C语言中写下以下代码,编译无问题
int* i=NULL;
char* pc=NULL;
因为C语言中把空指针赋给int和char指针的时候,发生了隐式类型转换,把void指针转换成了相应类型的指针。
但是C++是强制型语言,void*是不能隐式转换成其他类型指针的,所以编译器提供的头文件做了相应类型的处理:
#ifdef _cplusplus
#define NULL 0
#else
#define NULL((void*)0)
#endif
可见,C++中 NULL实际是0,因为C++中不能把void*类型的指针隐式转换成其他类型的指针,所以为了结果空指针的表示问题,引入了0表示空指针
但是实际上,用NULL代替0表示空指针在函数重载时会出现问题,如下:
#include<iostream>
using namespace std;
void func(void* i)
{
cout<<”func1”<endl;
}
void func(int i)
{
cout<<”func2”<<endl;
}
void main(int argc, char* argv[])
{
func(NULL);
func(nullptr);
getchar();
}
结果为:
func2
func1
这段代码我们对函数func进行重载,参数分别是void*类型和int类型,但是运行结果却与我们使用NULL的初衷是相违背的,因为我们本来是想用NULL代表空指针,但是在将NULL输入到函数中,他却选择了int形参这个函数版本。所以是有问题的,这就是NULL代替空指针在C++中的二义性。
总结:
NULL在C++中就是0,建议以后还是都用nullptr表示空指针,而NULL就当0用。
学习来源:https://blog.csdn.net/qq_18108083/article/details/84346655?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-84346655-blog-51249555.pc_relevant_multi_platform_whitelistv5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-84346655-blog-51249555.pc_relevant_multi_platform_whitelistv5&utm_relevant_index=16