6.4 NULL 是什么, 它是怎么定义的?

作为一种风格, 很多人不愿意在程序中到处出现未加修饰的 0。因此定义了预处理宏  NULL (在 <stdio.h> 和其它几个头文件中) 为空指针常数, 通常是 0 或者 ((void *)0) (参见问题 5.6)。希望区别整数 0 和空指针 0  的人可以在需要空指针的地方使用 NULL。

使用 NULL 只是一种风格习惯; 预处理器把所有的 NULL 都还原回 0, 而编译还是依照 上文的描述处理指针上下文的 0。特别是, 在函数调用的参数里, NULL 之前 (正如在 0  之前) 的类型转换还是需要。问题 5.2 下的表格对 0 和 NULL 都有效 (带修饰的  NULL 和带修饰的 0 完全等价)。

NULL 只能用作指针常数; 参见问题 5.7

参考资料: [K&R1, Sec. 5.4 pp. 97-8]; [K&R2, Sec. 5.4 p. 102]; [ISO, Sec. 7.1.6, Sec. 6.2.2.3]; [Rationale, Sec. 4.1.5]; [H&S, Sec. 5.3.2 p. 122, Sec. 11.1 p. 292]。

翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)