根據語言定義, 在指標上下文中的常數 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]。
乙個動態的指標陣列怎樣獲得長度
在debug 下 可以解決,但是在release 模式下 不知道如何解決 include using namespace std int getnewbuffersize void p int main int arry new int 10 for int i 0 i 10 i arry i 0 ...
在程式中怎樣實現乙個搜尋功能
如果我們的 也需要乙個搜尋功能,只提供乙個文字框和乙個鍵銨鈕。實現這樣的搜尋功能,也許搜尋的資訊分布有多個表中,或是某一表中其中一二個字段。下面insus.net就分享一下自己的實現方法,你看後可以參考,改正,優化。在程式中你可以設計乙個介面,簡單如下 銨鈕click事件 上面的click事件中,有...
怎樣在虛擬機器裡搭建乙個論壇《案例一》?
案例1 lamp安裝及啟用 1 案例1 lamp安裝及啟用 1.1 問題 1 安裝lamp平台各元件 安裝好軟體httpd mariadb server mariadb php php mysql 確認安裝結果2 啟用lamp 平台 開啟系統服務httpd mariadb,將上述服務設定為開機自執行...