前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言中NULL究竟是不是0 等问题?

C语言中NULL究竟是不是0 等问题?

作者头像
编程珠玑
发布2020-03-31 18:16:38
2.7K0
发布2020-03-31 18:16:38
举报
文章被收录于专栏:编程珠玑

有人提问:C语言中NULL究竟是不是0 等问题?

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

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

代码语言:javascript
复制
#define NULL ((void*)0)

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

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

代码语言:javascript
复制
//来源:公众号【编程珠玑】
//作者:守望先生
#include <stdio.h>
int main(void)
{
    int *p = NULL;
    int a = 0;
    p++;
    a++;
    printf("p value:%p a value:0x%x\n",p,a);
    return 0;
}

输出结果:

代码语言:javascript
复制
 p value:0x4 a value:0x1 

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

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

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

NULL存在的意义是什么

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

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

代码语言:javascript
复制
int *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含义不一样
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NULL与数字0是不是等价的?
  • NULL可以理解为p指向地址值为0的内容?
  • NULL存在的意义是什么
  • NULL一定得是0值吗?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档