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)