基础知识练习
学生:如果为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地出
现?
小林:C 程序员传统上喜欢知道很多要知道的还要多关于机器实现的细节。空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。
而预处理宏 (NULL) 的使用又似乎在暗示这个值可能在某个时刻或者在某种怪异的机器上会改变。
“if(p == 0)” 这种结构又很容易被误认为在比较之前把 p 转成了整数类型, 而不是把 0 转成了指针类型。最后, 术语 “空” 的几种用法之间的区别又可能被忽视。
冲出这些迷惘的一个好办法是想象 C 使用一个关键字 (或许象 Pascal 那样,用 “nil”) 作为空指针常数。编译器要么在源代码没有歧义的时候把 “nil” 转成适当类型的空指针, 或者有歧义的时候发出提示。
现在事实上, C 语言的空指针常数关键字不是 “nil” 而是 “0”, 这在多数情况下都能正常工作, 除了一个未加修饰的“0” 用在非指针上下文的时候, 编译器把它生成整数 0 而不是发出错误信息
如果那个未加修饰的 0 是应该是空指针常数, 那么生成的程序不行。
学生:我很困惑。我就是不能理解这些空指针一类的东西。
小林:有两条简单规则你必须遵循:
1. 当你在源码中需要空指针常数时, 用 “0” 或 “NULL”。
2. 如果在函数调用中 “0” 或 “NULL” 用作参数, 把它转换成被调函数需要的指针类型讨论的其它内容是关于别人的误解, 关于空指针的内部表达 (这你无需了解),和关于函数原型的复杂性的。
正文完