NULL 和nullptr

在阅读李同学(看不懂啊啊啊啊啊)的代码时,发现李同学空指针不是用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值