注意:此答案适用于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”,因此我们将其反转为“为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 *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
因为这些被编译器视为正常比较。
空字符
'\0'
被定义为空字符-所有位都设置为零的字符。这与指针无关。但是,您可能会看到类似于以下代码的内容:
if (!*string_pointer)
检查字符串指针是否指向空字符
if (*string_pointer)
检查字符串指针是否指向非空字符
不要将它们与空指针混淆。仅仅因为位表示是相同的,并且这允许一些方便的交叉情况,所以它们实际上不是同一回事。
此外,'\0'
(与所有字符文字一样)是一个整数常量,在这种情况下,其值为零。因此,'\0'
它完全等同于一个未经修饰的0
整数常量-唯一的区别在于它传达给人类读者的意图(“我将其用作空字符”。)。
参考文献
有关更多信息,请参见comp.lang.c FAQ的问题5.3。有关C标准,请参见此pdf。查看第6.3.2.3节“指针”第3段。