6.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出现?
C 程序员传统上喜欢知道很多 (可能比他们需要知道的还要多) 关于机器实现的细节。 空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。 而预处理宏 (NULL) 的使用又似乎在暗示这个值可能在某个时刻或者在某种怪异的机 器上会改变。``if(p == 0)" 这种结构又很容易被误认为在比较之前把 p 转成了整 数类型, 而不是把 0 转成了指针类型。最后, 术语 ``空" 的几种用法 (如上文 问题 5.10 所列出的) 之间的区别又可能被忽视。
冲出这些迷惘的一个好办法是想象 C 使用一个关键字 (或许象 Pascal 那样, 用 ``nil") 作为空指针常数。编译器要么在源代码没有歧义的时候把 ``nil" 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常 数关键字不是 ``nil" 而是 ``0", 这在多数情况下都能正常工作, 除了一个未加修饰 的 ``0" 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息, 如果那个未加修饰的 0 是应该是空指针常数, 那么生成的程序不行。
C 程序员传统上喜欢知道很多 (可能比他们需要知道的还要多) 关于机器实现的细节。 空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。 而预处理宏 (NULL) 的使用又似乎在暗示这个值可能在某个时刻或者在某种怪异的机 器上会改变。``if(p == 0)" 这种结构又很容易被误认为在比较之前把 p 转成了整 数类型, 而不是把 0 转成了指针类型。最后, 术语 ``空" 的几种用法 (如上文 问题 5.10 所列出的) 之间的区别又可能被忽视。
冲出这些迷惘的一个好办法是想象 C 使用一个关键字 (或许象 Pascal 那样, 用 ``nil") 作为空指针常数。编译器要么在源代码没有歧义的时候把 ``nil" 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常 数关键字不是 ``nil" 而是 ``0", 这在多数情况下都能正常工作, 除了一个未加修饰 的 ``0" 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息, 如果那个未加修饰的 0 是应该是空指针常数, 那么生成的程序不行。
授人以渔,不授人以鱼。