李佳
19011210599
轉(zhuǎn)載至https://mp.weixin.qq.com/s/RFxLdTO-iaarloLTCuO3hQ
【嵌牛導(dǎo)讀】空指針0和NULL
【嵌牛鼻子】0犀暑、NULL
【嵌牛提問】空指針0和NULL有什么用甥绿?
【嵌牛正文】
學(xué)生:為什么有那么多關(guān)于空指針的疑惑?為什么這些問題如此經(jīng)常地出現(xiàn)呢疾掰?
小林:C 程序員傳統(tǒng)上喜歡知道很多要知道的還要多關(guān)于機(jī)器實現(xiàn)的細(xì)節(jié)⌒旖簦空指針在源碼和大多數(shù)機(jī)器實現(xiàn)中都用零來表示的事實導(dǎo)致了很多無根據(jù)的猜測静檬。而預(yù)處理宏 (NULL) 的使用又似乎在暗示這個值可能在某個時刻或者在某種怪異的機(jī)器上會改變〔⒓叮“if(p == 0)” 這種結(jié)構(gòu)又很容易被誤認(rèn)為在比較之前把 p 轉(zhuǎn)成了整數(shù)類型, 而不是把 0 轉(zhuǎn)成了指針類型拂檩。最后, 術(shù)語 “空” 的幾種用法之間的區(qū)別又可能被忽視。沖出這些迷惘的一個好辦法是想象 C 使用一個關(guān)鍵字 (或許象 Pascal 那樣,用 “nil”) 作為空指針常數(shù)嘲碧。編譯器要么在源代碼沒有歧義的時候把 “nil” 轉(zhuǎn)成適當(dāng)類型的空指針, 或者有歧義的時候發(fā)出提示稻励。
現(xiàn)在事實上, C 語言的空指針常數(shù)關(guān)鍵字不是 “nil” 而是 “0”, 這在多數(shù)情況下都能正常工作, 除了一個未加修飾的“0” 用在非指針上下文的時候, 編譯器把它生成整數(shù) 0 而不是發(fā)出錯誤信息,如果那個未加修飾的 0 是應(yīng)該是空指針常數(shù), 那么生成的程序不行愈涩。
學(xué)生:我很困惑望抽。我就是不能理解這些空指針一類的東西。
小林:有兩條簡單規(guī)則你必須遵循:
1. 當(dāng)你在源碼中需要空指針常數(shù)時, 用 “0” 或 “NULL”履婉。
2. 如果在函數(shù)調(diào)用中 “0” 或 “NULL” 用作參數(shù), 把它轉(zhuǎn)換成被調(diào)函數(shù)需要的指針類型討論的其它內(nèi)容是關(guān)于別人的誤解, 關(guān)于空指針的內(nèi)部表達(dá) ,和關(guān)于函數(shù)原型的復(fù)雜性的煤篙。