Q整数如何转换为指针,指针又如何转换为整数?我能否临时将整数“塞”进指针,或者将指针“塞”进整数?
A很久以前,可以保证指针可以转换为整数(尽管你永远不知道需要int和long),整数可以转换为指针,指针在转换为(足够大的)整数后再转回指针时保持不变,并且这种转换(以及任何映射)旨在“让了解机器寻址结构的人感到毫不意外”。换句话说,整数/指针转换有一些先例和支持,但它们一直依赖于机器,因此不具有可移植性。显式转换(cast)一直都是必需的(尽管早期编译器很少抱怨你省略它们)。
ANSI/ISO C 标准为了确保 C 能够被广泛实现,已经削弱了这些早期的保证。指针到整数和整数到指针的转换是实现定义的(参见问题 11.33),并且不再保证指针可以转换为整数后再转换回来而不发生改变。
将指针强制转换为整数,或将整数强制转换为指针,从来都不是好的做法。当你需要一个可以同时容纳这两种数据的通用槽时,联合(union)是一个更好的主意。
参考文献:K&R1 第 A14.4 节,第 210 页
K&R2 第 A6.6 节,第 199 页
ISO 第 6.3.4 节
Rationale 第 3.3.4 节
H&S 第 6.2.3 节第 170 页,第 6.2.7 节第 171-2 页