c语言中NULL和0相等吗,NULL,‘\0’和0之间的区别是什么?

这个答案适用于C语言,而不是C+。

空指针

整数常量文字0有不同的含义取决于使用它的上下文。在所有情况下,它仍然是一个整数常量,其值为0,只是用不同的方式来描述。

如果要将指针与常量文字进行比较,则为0,然后检查指针是否为空指针。这,这个0则称为空指针常量。C标准定义0转换为类型void *是空指针和空指针常量。

此外,为了提高可读性,宏NULL在头文件中提供。stddef.h..根据编译器的不同,#undef NULL把它重新定义为古怪的东西。

因此,下面是检查空指针的一些有效方法:if (pointer == NULL)

NULL定义为等于空指针。它是实现定义的实际定义。NULL只要它是一个有效的空指针常量。if (pointer == 0)

0是空指针常量的另一个表示形式。if (!pointer)

这,这个if语句隐式检查“不是0”,因此我们将其反转为“is 0”。

下面是检查空指针的无效方法:int mynull = 0;if (pointer == mynull)

对于编译器来说,这不是对空指针的检查,而是对两个变量的相等检查。这,这个强权如果mynull从未更改代码,编译器优化常量将0折叠到if语句中,则工作,但这并不一定,编译器必须根据C标准至少生成一条诊断消息(警告或错误)。

注意,什么是C语言中的空指针。在底层架构上,这并不重要。如果底层体系结构有一个空指针值定义为地址0xDEADBEEF,那么就由编译器来排序这个混乱。

因此,即使在这种有趣的体系结构中,以下方法仍然是检查空指针的有效方法:if (!pointer)if (pointer == NULL)if (pointer == 0)

下面是检查空指针的无效方法:#define MYNULL (void *) 0xDEADBEEFif (pointer == MYNULL)if (pointer == 0xDEADBEEF)

因为编译器将这些看作是正常的比较。

空字符

'\0'定义为空字符-即将所有位设置为零的字符。这与指针无关。但是,您可能会看到类似于以下代码的内容:if (!*string_pointer)

检查字符串指针是否指向空字符。if (*string_pointer)

检查字符串指针是否指向非空字符。

不要将这些与空指针混淆。仅仅因为位表示是相同的,而且这允许一些方便的交叉情况,它们实际上不是一回事。

此外,'\0'是一个整数常量(与所有字符文本一样),在本例中为零。所以'\0'完全等同于未装饰的0整数常量-唯一的区别是意图它传达给人类读者(“我正在使用这个作为空字符。”)。

参考文献

看见问题5.3.lang.c常见问题为了更多。看见此pdf为C标准。请参阅6.3.2.3节的指针,第3段。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值