Q什么是NULL,它是如何定义的?
A出于风格上的原因,许多程序员不希望在程序中散布着未加修饰的0“0” 值,有些代表数字,有些代表指针。因此,预处理器宏NULL被定义(在多个头文件中,包括<stdio.h>和<stddef.h>)为一个空指针常量,通常是0或((void *)0)(另请参见问题 5.6)。希望明确区分0整数和0空指针常量的程序员,则可以使用NULL在需要空指针的地方。
使用NULL仅仅是风格上的约定;预处理器会将NULL重新转换为0,而在指针上下文中,编译器会像以前一样识别它。特别是,在NULL(如前所述0)作为函数调用参数时,仍然可能需要强制类型转换。问题 5.2 下的表格同样适用于NULL和0(未加修饰的NULL0 等同于未加修饰的 0)。
NULL应仅用作指针常量;请参见问题 5.9。
参考文献:K&R1 第 5.4 节 pp. 97-8
K&R2 第 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