词条 | 空指针常量 |
释义 | 对于空指针值,一般的文档中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 “null pointer”(空指针)。一句话, 空指针是什么,就是一个被赋值为0的指针,在没有被具体初始化之前,其值为0. 在us/os中普遍的用到了,对指针是否为空指针的判断,而没有把C语言中其中的语法知识讲解出来,很多同学对此理解有些含糊,趁着有时间,把其中的一些疑问及解答列举如下。若有错误请指正。 问题一: 什么是空指针常量(null pointer constant)? An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. (一个表示0值的整数常量,叫做空指针常量) 解释: 0、0L 、3 - 3(它们都是“integer constant expression”整数常量表达式)以及 (void*)0 等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。 至于系统选取哪种形式作为空指针常量使用,则是实现相关的。 一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L); 问题二: 什么是空指针(null pointer)? 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. ( 如果一个 空指针常量 赋给了一个有类型的指针变量,那么这个指针就叫空指针。它不指向任何的对象或者函数) 解释:如果 p 是一个指针变量, 若进行: p = 0;、p = 0L;、p = '\\0';、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;) p 都成为一个空指针,并且由系统保证空指针不指向任何实际的对象或者函数。 反过来说,任何对象或者函数的地址都不可能是空指针。 问题三: 什么是 NULL? The macro( 宏)NULL is defined in <stddef.h> (and other headers) as a null pointer constant (NULL作为一个宏定义为一个空指针常量) 即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。 有些系统中这样来宏定义的 #define NULL 0 char *p = NULL; 问题四:空指针(null pointer)指向了内存的什么地方即空指针的内部实现? 标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体请参见 C FAQ。 在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示——如上所述,有时它们是不同的。 问题5: 在实际的操作中 如何判断某个指针是不是空指针? 可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。 指针变量 p 是空指针的判断: (假设 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 ) 问题6: 可以定义自己的 NULL 的实现吗? 解释: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 为不同的内容是非法的,其行为是未定义的 问题7:malloc 函数在分配内存失败时返回 0 还是 NULL? 解释: malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针): If the space cannot be allocated, a null pointer is returned. 它指向系统内存具体哪个地方是由系统决定的,应用者不必去深究。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。