问为什么空指针会引起如此多的困惑?为什么这些问题经常出现?
答C 程序员传统上喜欢了解(也许是超过他们需要的)底层机器实现。空指针在源代码和内部大多数机器上都被表示为零,这会引起不必要的假设。使用预处理器宏(NULL)似乎表明该值在将来某天或在某些奇怪的机器上可能会改变。构造“if(p == 0)”很容易被误读为在比较之前将p转换为整型,而不是0转换为指针类型。最后,术语“空”的几种用法(在问题 5.13 中列出)之间的区别经常被忽略。
摆脱困惑的一个好方法是想象 C 使用了一个关键字(也许像 Pascal 那样是nil)作为空指针常量。编译器可以将nil转换为适当类型的空指针,前提是它可以从源代码中明确确定该类型,或者在无法确定时发出警告。实际上,在 C 中,空指针常量的关键字不是nil而是0,这几乎同样有效,但有一个例外:在非指针上下文中未强制转换的0会生成整数零而不是错误消息,而如果那个未强制转换的0本应是空指针常量,那么生成的程序可能无法工作。
附加链接:Richard Stamp 的一篇 文章,提供了关于 NULL/0 区别的另一个角度。