c中NULL,'\0'和0之间的区别. (the difference between NULL,'\0' and 0 in c)

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是相等的.唯一的不同就是他传达给读者的意图(我在使用一个空字符).

 

posted on 2012-09-26 23:45  algorithmic  阅读(1041)  评论(0编辑  收藏  举报

导航