C語言中的void *(譯)

打算深入的學(xué)習(xí)一下操作系統(tǒng)以及C語言,通過《Beginning Linux Programming,4Ed》這本書。研究書中的源代碼時(shí),就遇到了**void ***.由于以前學(xué)習(xí)C語言時(shí),只是簡(jiǎn)單的學(xué)習(xí)了一下語法,并沒有深入的學(xué)習(xí),所以,看到這個(gè)讓我很懵逼。

在Java中,我們使用void的場(chǎng)景,只有當(dāng)作為函數(shù)的返回值時(shí)。那C語言中,**void ***到底是什么意思呢?

Google找到了一篇文章,下面我把它翻譯下來。盡管這篇文章的評(píng)論中批評(píng)作者寫的不是很通俗易懂,不夠條理。但是我看著寫的還不錯(cuò)?;旧习?*void ***的作用說出來了。

下面開始正文。

在C語言中,**void *是一個(gè)沒有數(shù)據(jù)類型的指針。所以,void ***可以存放任何類型的數(shù)據(jù)的地址,并且可以被轉(zhuǎn)換成任意類型。

void 的優(yōu)點(diǎn):malloc()函數(shù)和colloc()函數(shù)的返回值,都是*void ***,這樣,我們就能用這些函數(shù)來為任意類型分配內(nèi)存了。

注意:上面的程序是在C語言環(huán)境中編譯的,而不是在C++環(huán)境中編譯的。在C++中,我們必須明確的將malloc函數(shù)的返回值轉(zhuǎn)換成**int ***.

當(dāng)然,**void ***也有一些限制:

  • **void *不能被dereferenced(這個(gè)單詞翻譯成中文感覺很難懂,這里就直接使用這個(gè)單詞。這句話的意思是,void ***形式的指針變量,不能通過在其前面添加星號(hào)的形式來獲取其值)。例如,下面的程序就不正確:

輸出Compiler Error: 'void' is not a pointer-to-object type*.

下面的程序卻能正常編譯并輸出正確結(jié)果,因?yàn)槲覀冾A(yù)先將**void *類型的指針轉(zhuǎn)換成了int ***類型的指針:

會(huì)輸出正確的結(jié)果,10.這里有一點(diǎn)需要注意,別亂用**void ***在不同數(shù)據(jù)類型的指針之間轉(zhuǎn)換,因?yàn)椴煌瑪?shù)據(jù)類型占用的字節(jié)數(shù)不一樣,亂用很可能會(huì)導(dǎo) 致出現(xiàn)不正確的結(jié)果。

  • C語言標(biāo)準(zhǔn)中,不允許對(duì)**void *進(jìn)行指針的運(yùn)算。然而,在GNU C中,卻是可以的。void ***的長(zhǎng)度會(huì)被判定為1.例如下面的程序,可以在gcc中,被正常編譯并運(yùn)行。

輸出結(jié)果為2.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容