NULL详解

1. 定义:

在C语言中和C++中定义是不同的。相关代码如下:


#undef NULL

#if defined(__cplusplus)

#define NULL 0

#else

#define NULL ((void *)0)

#endif

为什么在C中和C++中的定义是不一样的呢?原因如下:

在C语言中,看定义就好理解,直接定义为空指针。(此处也得声明一下,本质上0并非是空的含义,只是这样定义在解引用的时候相当于是访问0x00000000地址,而对于一般而言,0地址通常是不可访问的)。

而对于C++而言。因为C++中不能将void *类型的指针隐式转换成其他指针类型。但是0可以。所以不能将NULL定义为(void*)0,而定义为了0。

 

2. C++11标准中出现的nullptr

在C++中虽然将NULL定义为了0,但是有时候又特别容易出错。例子如下:

#include<iostream>
using namespace std;

void test(void *p)
{
    cout<<"p is pointer "<<p<<endl;
}

void test(int num)
{
    cout<<"num is int "<<num<<endl;
}

int main(void)
{
    test(NULL);
    return 0;
}

在这个示例中,test函数重载,但是NULL本质上是0,导致重载出现二义性。理论上两个函数定义都可以匹配。因此,为了解决这个问题,在C++11标准中,引入了nullptr的关键字。

test(nullptr);

则可以有效的解决这个问题。因此在C++中, 如果要表达空指针,则最好使用nullptr关键字。

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值