1.空指针.
整数0常量在不同的情况下可能有不同的含义,这取决于使用它的上下文。在所有的情况下,它仍然是一个常数,也就是为0的整数,只是经不同的方式描述而已。如果拿一个指针和常量0进行比较,那么这是一个检查指针是否是空指针。这时0代表是一个空指针常量。在标准C定义中:0 可转型为 void*类型,这时 0是一个空指针或一个空指针常量。
此外,为了提高程序的可读性,NULL宏在stddef.h文件中定义了.但是你的编译器可能会使用#undef NULL, 并将NULL定义成了其它奇怪的东西了,但是这种情况是永远不可能出现的.
下面有三种检查空指针的方式:
if (pointer == NULL) //NULL的定义被用来比较空指针.
if (pointer == 0) //0是空指针针的另外一种表殃形式.
if (!pointer) //这个其实是隐含的检查是否为0
关于第三个Bool类型的判断,可以参考: BOOL类型的判断
非法的判断方式下面所示:
int mynull = 0; <some code> if (pointer == mynull)
这个对编译器来说,不是判断是否是空指针了,而是比较两个变量是否相等.在mynuul的值从来没有改变过的情况下,是可以的,但是如果变了,那就会造成意想不到的结果了.
需要注意的是:什么是C中的空指针.空指针和底层的框架无关,如底层将空指针定义成了地址为:0xDEADBEEF,但是我们没有必要关心这个,编译器会为我们处量这个事情的.所以即使在这种可笑的架构中,我们在上面所说的三种判断空指针的方式仍然是正确的.
但下面这些检查空指针的方式就是非法的:
#define MYNULL (void*)0xDEADBEEF if(pointer == MYNULL) if(pointer ==0xDEADBEEF)
2.空字符串.
'\0'被定义为空字符,因为他是一个字符所有的位都被设为0了.这和指针没有任何的关系.你可能会看到和下面相似的代码.
if (!*string_pointer) if (*string_pointer)
这两种方式分别是用来判断指针是否是指向空字符的.这不要和空指针搞混了.正因为bit表示是一样的,并且可能会在有些情况下会交叉使用,但是实际上他们是并不相同的.
需要注意的是: '\0'最多的是用来表示字符串的结尾.
此外:
'\0'(和所有的字符)都是整形常量.他和0是相等的.所以'\0'是整形的0是相等的.唯一的不同就是他传达给读者的意图(我在使用一个空字符).