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

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

在C中,不同的零值之间似乎存在差异-NULLNUL0.

我知道ASCII的角色'0'评估为480x30.

这个NULL指针通常定义为:

#define NULL 0

#define NULL (void *)0

此外,还有NUL'\0'这似乎是在评估0也是。

这三种价值观是否有不平等的时候?

64位系统也是这样吗?


翻阅古今
浏览 1179回答 3
3回答

温温酱

这个答案适用于C语言,而不是C+。空指针整数常量文字0有不同的含义取决于使用它的上下文。在所有情况下,它仍然是一个整数常量,其值为0,只是用不同的方式来描述。如果要将指针与常量文字进行比较,则为0,然后检查指针是否为空指针。这,这个0则称为空指针常量。C标准定义0转换为类型void *是空指针和空指针常量。此外,为了提高可读性,宏NULL在头文件中提供。stddef.h..根据编译器的不同,#undef NULL把它重新定义为古怪的东西。因此,下面是检查空指针的一些有效方法:if&nbsp;(pointer&nbsp;==&nbsp;NULL)NULL定义为等于空指针。它是实现定义的实际定义。NULL只要它是一个有效的空指针常量。if&nbsp;(pointer&nbsp;==&nbsp;0)0是空指针常量的另一个表示形式。if&nbsp;(!pointer)这,这个if语句隐式检查“不是0”,因此我们将其反转为“is 0”。下面是检查空指针的无效方法:int&nbsp;mynull&nbsp;=&nbsp;0;<some&nbsp;code>if&nbsp;(pointer&nbsp;==&nbsp;mynull)对于编译器来说,这不是对空指针的检查,而是对两个变量的相等检查。这,这个强权如果mynull从未更改代码,编译器优化常量将0折叠到if语句中,则工作,但这并不一定,编译器必须根据C标准至少生成一条诊断消息(警告或错误)。注意,什么是C语言中的空指针。在底层架构上,这并不重要。如果底层体系结构有一个空指针值定义为地址0xDEADBEEF,那么就由编译器来排序这个混乱。因此,即使在这种有趣的体系结构中,以下方法仍然是检查空指针的有效方法:if&nbsp;(!pointer)if&nbsp;(pointer&nbsp;==&nbsp;NULL)if&nbsp;(pointer&nbsp;==&nbsp;0)下面是检查空指针的无效方法:#define&nbsp;MYNULL&nbsp;(void&nbsp;*)&nbsp;0xDEADBEEFif&nbsp;(pointer&nbsp;==&nbsp;MYNULL)if&nbsp;(pointer&nbsp;==&nbsp;0xDEADBEEF)因为编译器将这些看作是正常的比较。空字符'\0'定义为空字符-即将所有位设置为零的字符。这与指针无关。但是,您可能会看到类似于以下代码的内容:if&nbsp;(!*string_pointer)检查字符串指针是否指向空字符。if&nbsp;(*string_pointer)检查字符串指针是否指向非空字符。不要将这些与空指针混淆。仅仅因为位表示是相同的,而且这允许一些方便的交叉情况,它们实际上不是一回事。此外,'\0'是一个整数常量(与所有字符文本一样),在本例中为零。所以'\0'完全等同于未装饰的0整数常量-唯一的区别是意图它传达给人类读者(“我正在使用这个作为空字符。”)。参考文献看见问题5.3.lang.c常见问题为了更多。看见此pdf为C标准。请参阅6.3.2.3节的指针,第3段。

眼眸繁星

似乎有许多人误解了NULL、‘\0’和0之间的区别。因此,为了解释,并试图避免重复早些时候说过的话:值为0的int类型的常量表达式或此类型的表达式强制转换为void*是空指针常数,如果转换为指针,则该指针将成为空指针..用标准来保证比较不等于指向任何对象或函数的指针.零是宏,在空指针常数.'\0'是用于表示空字符用于终止字符串。A&nbsp;空字符是将其所有位设置为0的字节。

慕仙森

这三个词都在不同的上下文中定义了零的含义。指针上下文-NULL,它意味着指针的值是0,这与它是32位还是64位无关(一个是4个字节,另一个是8个字节的零)。字符串上下文-表示数字零的字符的十六进制值为0x30,而NUL字符的十六进制值为0x00(用于终止字符串)。当您查看内存时,这三者总是不同的:NULL&nbsp;-&nbsp;0x00000000&nbsp;or&nbsp;0x00000000'00000000&nbsp;(32&nbsp;vs&nbsp;64&nbsp;bit)NUL&nbsp;-&nbsp;0x00&nbsp;or&nbsp;0x0000&nbsp;(ascii&nbsp;vs&nbsp;2byte&nbsp;unicode)'0'&nbsp;-&nbsp;0x20我希望这能澄清这一点。
打开App,查看更多内容
随时随地看视频慕课网APP