0、 '0'、 '\0'、 "\0"和NULL的含义相近,容易混淆,这给出5者的区别。 (1)0 could be digit zero, that is, a numerical value,即数字0 (2)'0' could be the character zero. 即编码为0b00110000的字符0 (4)'\0' is the null character used to terminate strings in C/C++.即转义字符,标识字符串的结尾。 (5)"\0" is an empty string.即空字符串。
在探究的过程中找到下面的一个帖子。很是不错,COPY如下。 转载自:http://blog.chinaunix.net/u/18517/showart_309917.html 本文转自: 帖子里讨论了C语言中的空指针、空指针常量、NULL、0等概念及相互关系及区别。这里摘录whyglinux兄的总结。做个标签,呵呵^_^ 1. 什么是空指针常量(null pointer constant)? [6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant
3. 什么是空指针(null pointer)? [6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function. char *p=0;此时p就是一个空指针,不指向任何实际对象。 因此,如果 p 是一个指针变量,则 p = 0;、p = 0L;、p = '\0';、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。(tyc: 比如这里的(void*)0就是一个空指针。把它理解为null pointer还是null pointer constant会有微秒的不同,当然也不是紧要了)
4. 什么是 NULL? [6.3.2.3-Footnote] The macro NULL is defined in (and other headers) as a null pointer constant 即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)
6. 如何判断一个指针是否是一个空指针? 这可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。例如,假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用下列任意形式之一——它们在实现的功能上都是等价的,所不同的只是风格的差别。
指针变量 p 是空指针的判断: if ( p == 0 ) if ( p == '\0' ) if ( p == 3 - 3 ) if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */ if ( NULL == p ) if ( !p ) if ( p == q ) ...
指针变量 p 不是空指针的判断: if ( p != 0 ) if ( p != '\0' ) if ( p != 3 - 3 ) if ( p != NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */ if ( NULL != p ) if ( p ) if ( p != q ) ...
7. 可以用 memset 函数来得到一个空指针吗? 这个问题等同于:如果 p 是一个指针变量,那么memset( &p, 0, sizeof(p) ); 和 p = 0;是等价的吗? 答案是否定的,虽然在大多数系统上是等价的,但是因为有的系统存在着“非零空指针” (nonzero null pointer),所以这时两者不等价。由于这个原因,要注意当想将指针设置为空指针的时候不应该使用 memset,而应该用空指针常量或空指针对指针变量赋值或者初始化的方法。
8. 可以定义自己的 NULL 的实现吗?兼答"NULL 的值可以是 1、2、3 等值吗?"类似问题 [7.1.3-2] If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined. NULL 是标准库中的一个符合上述条件的 reserved identifier (保留标识符)。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。也就是说,如果是符合标准的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。
9. malloc 函数在分配内存失败时返回 0 还是 NULL? malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针): [7.20.3-1] If the space cannot be allocated, a null pointer is returned. 对于空指针值,一般的文档(比如 man)中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 “null pointer”(空指针)。(tyc:一般系统中手册中都返回NULL,那我们就用NULL吧)