background image

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.

这里告诉我们:0、0L、'\0'、3 - 3、0 * 17 

(它们都是 integer constant 

expression”

 

)以及 (void*)0 (tyc  

: 我觉得(void*)0 应该算是一个空指针吧,更

 

恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针

 

值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系

 

统选择 (void*)0 

 

或者 0 

 

的居多(也有个别的选择 0L

 

);至于 C++ 系统,由于存

在严格的类型转化的要求,void* 

 

不能象 C 中那样自由转换为其它指针类型,所以

 

通常选 0 作为空指针常量(tyc: C++

 

标准推荐),而不选择 (void*)0。

2,什么是空指针(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.

 

因此,如果 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 会有微秒的不同,当

然也不是紧要了)

3,

 

什么是 NULL?

[6.3.2.3-Footnote] The macro NULL is defined in <stddef.h> (and other 
headers) as a null pointer constant

 

即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种

 

赋值方式之外,还可以用 p = NULL; 

 

来使 p 成为一个空指针。(tyc:很多系统中

的实现:#define NULL (void*)0

,与这里的 a null pointer constant”并不是完全

一致的)

4,空指针(null pointer)指向了内存的什么地方(空指针的内部实现)?

标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个

具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们

 

常见的空指针一般指向 0 

 

地址,即空指针的内部用全 0 来表示(zero null 

pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指

针(nonzero null pointer,非零空指针),具体请参见 C FAQ。

 

幸运的是,在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null 
pointer 

 

还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以

——

编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把

 

空指针的内部表示等同于整数 0 

——

的对象表示

如上所述,有时它们是不同的。