6.2 怎样在程序里获得一个空指针?

根据语言定义, 在指针上下文中的常数 0 会在编译时转换为空指针。也就是说, 在初始化、 赋值或比较的时候, 如果一边是指针类型的值或表达式, 编译器可以 确定另一边的常数 0 为空指针并生成正确的空指针值。因此下边的代码段完全 合法:
    char *p = 0;
    if(p != 0)
参见问题 5.3

然而, 传入函数的参数不一定被当作指针环境, 因而编译器可能不能识别未加 修饰的 0 ``表示" 指针。在函数调用的上下文中生成空指针需要明确的类型转换, 强制把 0 看作指针。例如, Unix 系统调用 execl 接受变长的以空指针结束 的字符指针参数。它应该如下正确调用:

    execl("/bin/sh", "sh", "-c", "date", (char *)0);

如果省略最后一个参数的 (char *) 转换, 则编译器无从知道这是一个空指针, 从而当作一个 0 传入。(注意很多 Unix 手册在这个例子上都弄错了。)

如果范围内有函数原型, 则参数传递变为 ``赋值上下文", 从而可以安全省略 多数类型转换, 因为原型告知编译器需要指针, 使之把未加修饰的 0  正确转换为适当的指针。函数原型不能为变长参数列表中的可变参数提供类型。 (参见问题 15.3) 在函数调用时对所有的空指针进行类型转换可能是预防 可变参数和无原型函数出问题的最安全的办法。

摘要:

可以使用未加修饰的 0: 需要显示的类型转换:
初始化 函数调用, 作用域内无原型
赋值 变参函数调用中的可变参数
比较  
固定参数的函数调用且在作用域内有原型  

参考资料: [K&R1, Sec. A7.7 p. 190, Sec. A7.14 p. 192]; [K&R2, Sec. A7.10 p. 207, Sec. A7.17 p. 209]; [ISO, Sec. 6.2.2.3]; [H&S, Sec. 4.6.3 p. 95, Sec. 6.2.7 p. 171]。

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