如您所知,在标准的现代C语言中,指针上下文中使用的常量0值充当空指针常量,它将转换为特定于平台(甚至可能是特定于类型)的空指针值.
同时,C语言的早期版本,如C参考手册中描述的那样,并没有对指针和整数上下文做出太多区分,允许人们自由地比较并将整数分配给指针.如果没有弄错,在那个版本的C中,常量0没有特殊状态,这意味着将常量0的值赋给指针只会使它指向物理地址0(就像将42的值赋值给指针一样使它指向物理地址42).
在ANSI C中,事情发生了重大变化.现在将常量0赋给指针会将一些特定于平台的空指针值放入该指针.空指针值不需要由物理0值表示.
那么,在C语言历史的哪个阶段它从一个变为另一个?考虑到其特殊状态,K&R C是否已经将空指针的更高级概念与常数0相结合?或者K&R C是否仍然保证整数指针的物理分配,即使是常数0?
它可以追溯到几乎 C的开头(如果不是最开始的话).如果您查看1974年1月C参考手册的第21页,它或多或少直接在一些示例代码中说明:
/* is pointer null? */
if (p == 0) {
Run Code Online (Sandbox Code Playgroud)
回去还是有点进一步,以约 1972-73 PDP-11/20编译器,我们发现:
match(tree, table, nreg)
int tree[], table[]; {
extern opdope[], dcalc, notcompat;
int op, d1, d2, t1, t2, p1[], p2[];
char mp[];
if (tree==0)
return(0);
op = *tree;
Run Code Online (Sandbox Code Playgroud)
至少如果我正确读取它,该if (tree==0)行在tree尝试取消引用之前检查是否为非空指针.
不幸的是,丹尼斯说他不能比"1972-73"更确定日期.
之前没有太多的C历史.尽管如此,似乎有一些0的历史被视为空指针.在我看来,使用0作为空指针是C"从Unix继承"的东西.为条目exec在1971年11月1 日版的Unix程序员手册显示的数值为0的指针信号的参数列表的末尾.根据丹尼斯的描述,此时"C还未到来".
基于这一切,我暂时得出结论,C从一开始就将0视为空指针,或者至少在很早的时候,可能不再有任何语言版本的记录.
我在追踪关于空指针可能具有非零位的第一个点的文档方面几乎没有成功.从语言的角度来看,这从未有过相关性.我怀疑它发生得很早,但找到支持这方面的文档会很困难.C的最早端口之一是IBM System/360大型机,虽然我找不到它的直接文档,但我猜测这些机器上使用的空指针值可能非零.我没有方便的确切数字,但我知道这些机器上的PL/I使用了非零值,因为它等效于空指针; 我猜想当他们将C移植到这些机器上时,他们可能使用相同的值.