关于c++中空指针nullptr

今天翻阅c++primer时,书中明确表示推荐用nullptr去表示空指针而不是NULL和0。

int *p1=nullptr;

int *p1=0;

int *p1=NULL;

这时有点好奇这三种表示方式有什么区别吗?下面一探究竟:

0在c++中表示就是整数0,这个所有人都清楚。但是NULL大部分对它有误解,或许你看到int *p1=NULL;这个语句你自然而然地就会知道p1是一个空指针,而且你可能下意识地的认为NULL就是表示空指针的意思,因为在别的地方也没见过用它,就是在表示空指针的时候见过。

其实NULL是一个宏,在c中表示:

#define NULL ((void *)0)

确实在c中NULL表示是空指针,在c中int *p1=NULL;这个语句是没有问题的,因为c是弱类型语言,void类型指针可以隐形转换成其他类型指针。

在c++中表示是:

 #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif

因为c++是强类型语言,对指针类型的隐形转换是不允许的,所以在c++中的宏定义中我们就可以看出来,NULL就是整数0。因此NULL就是0,在c++中这两个语句是一样。

int *p1=0;

int *p1=NULL;

 

在c++11标准之前,表示空指针使用NULL和0,这两种表示方式均存在缺陷。具体表示在函数重载时,

int func (int a,int b);

int func  (int a,int*b);

这里是一个简单的函数重载,下面我们进行测试发现,func(10,NULL),func(10,0)这两个都是调用的 int func(int a,int b)函数,NULL表示不是空指针而是0。

func(10,NULL);

func(10,0);

func(10,nullptr);

所以,为了避免0的二义性,要养成用nullptr关键字表示空指针的习惯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值