c++取消对null指针的引用_C语言中NULL究竟是不是0 等问题?

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

有人提问:C语言中NULL究竟是不是0 等问题?虽然之前在《NULL,0,'\0',“0”,"\0"你真的分得清吗?》中介绍过NULL和0的区别,本文决定再补充一些内容,做一些说明。

NULL与数字0是不是等价的?

在C语言中,NULL一般有如下定义(在stddef.h中):

1#define NULL ((void*)0)

看起来似乎是一样的?没错从这里看,值确实一样的。

但是,还记得在《void*是一种怎样的存在》中讲到过的吗?虽然它们值是一样的,但是它们的含义不一样。
举个简单的例子:

 1//来源:公众号【编程珠玑】
2//作者:守望先生
3#include 
4int main(void) 5{
6    int *p = NULL;
7    int a = 0;
8    p++;
9    a++;
10    printf("p value:%p a value:0x%x\n",p,a);
11    return 0;
12}

输出结果:

1 p value:0x4 a value:0x1 

看到了吗,同样的值,行为类似,却有着不一样的结果。

NULL可以理解为p指向地址值为0的内容?

就当前的定义来讲,可以这么理解,不过,之前就已经在《为什么解引用NULL会出现挂死》中说过,访问0地址的内容是不被允许的!

NULL存在的意义是什么

那么NULL作用是什么?实际上,它是为了保证NULL和其他任何非NULL指针对象或者是函数不相等
也就是说,一个实实在在的指针对象或者函数(了解更多关于函数指针),和NULL是不等的。

或者说,如果NULL转换为另外一种指针类型,那么它和NULL还是相等的。通俗讲就是

1int *p = (int*)NULL;

那么int*类型的p和void*类型的NULL,一定是相等的。

NULL一定得是0值吗?

实际上,NULL可以是整数0(C++中NULL为0,相关阅读《为什么建议你用nullptr而不是NULL》),也可以是某个整数值转换为void*。

实际上NULL并不一定需要是0。

总结

关于NULL和0,理解它们的类型不一样是很关键的,至于值本身是不是一样,并不重要。
更多内容可以参考C11标准文档的6.3.2.3 Pointers一节。

  • NULL的值可以为0,但不是必须为0

  • NULL用来和其他指针对象和函数区分开

  • NULL和0含义不一样

53061dc27391533af6e027ec83cd1946.png

c34074c596175628085b1acc11a7db7c.png

相关精彩推荐

4048a74d1d9e8fb6d11feabfddd9f4bc.png

NULL,0,'\0',“0”,"\0"你真的分得清吗?

为什么建议你用nullptr而不是NULL?

解引用NULL为什么会导致程序挂死?

高级指针话题-函数指针

void*到底是怎样的存在?

关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源

bf014ea145ae4a028336ba5db8d079a0.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值