为了账号安全,请及时绑定邮箱和手机立即绑定

NULL,‘\0’和0之间的区别是什么?

NULL,‘\0’和0之间的区别是什么?

C
翻阅古今 2019-06-12 15:51:46
NULL,‘\0’和0之间的区别是什么?在C中,不同的零值之间似乎存在差异-NULL, NUL和0.我知道ASCII的角色'0'评估为48或0x30.这个NULL指针通常定义为:#define NULL 0或#define NULL (void *)0此外,还有NUL字'\0'这似乎是在评估0也是。这三种价值观是否有不平等的时候?64位系统也是这样吗?
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

这个答案适用于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;<some code>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段。


查看完整回答
反对 回复 2019-06-12
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

似乎有许多人误解了NULL、‘\0’和0之间的区别。因此,为了解释,并试图避免重复早些时候说过的话:

值为0的int类型的常量表达式或此类型的表达式强制转换为void*是空指针常数,如果转换为指针,则该指针将成为空指针..用标准来保证比较不等于指向任何对象或函数的指针.

是宏,在空指针常数.

'\0'是用于表示空字符用于终止字符串。

空字符是将其所有位设置为0的字节。


查看完整回答
反对 回复 2019-06-12
?
慕仙森

TA贡献1827条经验 获得超7个赞

这三个词都在不同的上下文中定义了零的含义。

  • 指针上下文-NULL,它意味着指针的值是0,这与它是32位还是64位无关(一个是4个字节,另一个是8个字节的零)。
  • 字符串上下文-表示数字零的字符的十六进制值为0x30,而NUL字符的十六进制值为0x00(用于终止字符串)。

当您查看内存时,这三者总是不同的:

NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit)NUL - 0x00 or 0x0000 (ascii vs 2byte unicode)'0' - 0x20

我希望这能澄清这一点。


查看完整回答
反对 回复 2019-06-12
  • 3 回答
  • 0 关注
  • 1175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信