5.12真有机器用非零空指针?或者不同类型用不同的表达?
至少PL/I, Prime 50 系列用段07777, 偏移0 作为空指针。后来的型号使用段0, 偏移0 作为C 的空指针, 迫使类似TCNP (测试C 空指针) 的指令明显地成了现成的作出错误猜想的蹩脚C 代码。旧些的按字寻址的Prime 机器同样因为要求字节指针(char *) 比字指针(int *) 长而臭名昭著。Data General 的Eclipse MV 系列支持三种结构的指针格式(字、字节和比特
指针), C 编译器使用了其中之二:char * 和void * 使用字节指针, 而其它的使用字指针。某些Honeywell-Bull 大型机使用比特模式06000 作为(内部的) 空指针。CDC Cyber 180 系列使用包含环(ring), 段和位移的48 位指针。多数用户(在环11 上) 使用的空指针为0xB00000000000。在旧的1 次补码的CDC 机器上用全1 表示各种数据, 包括非法指针, 是十分常见的事情。
旧的HP 3000 系列对字节地址和字地址使用不同的寻址模式; 正如上面的机器一样, 它因此也使用不同的形式表达char * 和void * 型指针及其它指针。
Symbolics Lisp 机器是一种标签结构, 它甚至没有传统的数字指针; 它使用<NIL, 0> 对(通常是不存在的<对象, 偏移> 句柄) 作为C 空指针。根据使用的“内存模式”, 8086 系列处理器(PC 兼容机) 可能使用16 位的数据指针和32 位的函数指针, 或者相反。
一些64 位的Cray 机器在一个字的低48 位表示int *; char * 使用高16 位的
某些位表示一个字节在一个字中的偏移。
指针), C 编译器使用了其中之二:char * 和void * 使用字节指针, 而其它的使用字指针。某些Honeywell-Bull 大型机使用比特模式06000 作为(内部的) 空指针。CDC Cyber 180 系列使用包含环(ring), 段和位移的48 位指针。多数用户(在环11 上) 使用的空指针为0xB00000000000。在旧的1 次补码的CDC 机器上用全1 表示各种数据, 包括非法指针, 是十分常见的事情。
旧的HP 3000 系列对字节地址和字地址使用不同的寻址模式; 正如上面的机器一样, 它因此也使用不同的形式表达char * 和void * 型指针及其它指针。
Symbolics Lisp 机器是一种标签结构, 它甚至没有传统的数字指针; 它使用<NIL, 0> 对(通常是不存在的<对象, 偏移> 句柄) 作为C 空指针。根据使用的“内存模式”, 8086 系列处理器(PC 兼容机) 可能使用16 位的数据指针和32 位的函数指针, 或者相反。
一些64 位的Cray 机器在一个字的低48 位表示int *; char * 使用高16 位的
某些位表示一个字节在一个字中的偏移。