c++中0,NULL和nullptr的区别

       我们知道,在c语言中,是没有nullptr这个概念的,你可以使用NULL或者0来表示空指针。也就是说,c语言中的0和NULL是等价的。这是因为c语言中NULL是一个宏,被定义为了(void*)0。

#define NULL (void*)0
char *p = NULL;

       在上述代码块中,定义了一个字符指针p,并把它初始化为空,这是可行的。因为void * 类型可以转换为其他任何的指针类型 (把void指针转换成相应类型的指针)。

      而c++中的NULL虽然也是一个宏,但并不是和c语言中一样被定义为了(void *)0,c++中的NULL定义如下代码所示:

#define NULL 0
char *p = NULL;
char *p = nullptr;

可见,在c++中,NULL是被定义成了数字0的,为什么会这样呢?

这是和c++这种语言的特点有关的。

        c++相对于c语言而言,是一种类型安全的语言,在c++中进行赋值和传参的时候,会进行严格的类型校验,所以如果还和c语言中对NULL那样定义的话,由于c++类型安全的特点,将NULL赋值给别的指针变量类型时就会出现编译错误,所以解决方案是把它定义为0。这样的话,char *p = NULL的时候才不会出错。 

       然而这样就又会引入一个新的问题,就是造成二义性的问题,比如下面的两个函数声明:

void func(int);
void func(char*);

       上面是两个重载函数,一个形参是int类型,一个是字符指针类型。当调用func(NULL)的时候,它会去调用void func(int) , 然而我们是把NULL当做了空指针,显然是希望它能够执行void func(char*)的,所以这是不合理的。

       为了解决上述的问题, c++11引入了nullptr,即专门用来区分0和NULL。

nullptr的类型为nullptr_t,不是整数类型, 能够隐式的转换为任何指针。所以用空指针的时候推荐使用nullptr。

总结:在c++中,NULL和nullptr都可以实现把一个指针置为空的操作,但是在有的时候使用NULL会出错(如上所描述),所以建议使用c++编程的时候,都使用nullptr而不是NULL,这样就保证了不会出错! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值