void* 就是你所謂的 通用型的指針了

對於這樣的指針

void* p = NULL;

你不能 ++p

你不能 --p

你不能 p+10

你不能 *p

等等等等

因為這些操作全部是依賴指針指向的具體類型進行操作的

現在你有了一個單獨存地址的指針了

然後你拿到這個地址有什麼用呢

//////////////////////////////////////////////////////////////

各位熱心的朋友們

我很清楚 void* 怎麼用

[加大加粗加紅]轉換成特定類型指針[/加大加粗加紅] 然後再用

我這裡的回答是 完全徹底毫不留情的拋棄了類型信息之後

單純純凈潔白孤伶伶的一個void* 沒有用


咱們要是隻說c的話,我估計題主現在已經知道void指針了, 然後又發現void指針不能做算數運算(其實不絕對,有編譯器支持,但我們還是應該當作void * 不能算數運算比較好)。

In GNU C, addition and subtraction operations are supported on pointers to void and on pointers to functions. This is done by treating the size of a void or of a function as 1.

如果又想任意類型,又想算數運算怎麼辦?那就只能請出char*了,其實這貨很久以前一直用來指向任何類型,還能++,--以及各種算數運算。在pre c89的年代,就是這麼玩的,就是這麼任性。

任意類型指針可以幫助我們實現更加通用、一般性、或者說generic的功能函數,比如說printf,你不知道後面幾個參數是什麼類型。除此之外,我們有時候也故意用void *來擦除數據的類型,讓數據在傳遞和使用過程中,更加靈活,在某些情況下,還可以提高程序運行的效率。

前段時間還有一個朋友和我分享了他在俄羅斯某大學老師給他的作業,問為啥用char* 來指向任意的類型數據,我真是吐槽無力啊。我覺得那個老師對打剛入門的大學生應該像題主這麼問,為啥有了 void * 和 char * 我們還需要指定基類型呢?

因為濫用void* 會把「類型錯誤」從編譯器帶到運行期。因為運行期排查錯誤更麻煩,一般來說我們更想在編譯器檢查出所有的類型錯誤,所以如果不是特殊的需要,我們不用void *


本質上C語言本來就只有一種指針,內容是內存地址。「指針的類型」,是記錄了這個地址下的數據具體是個什麼格式。本質上說,這東西只是寫給編譯器以及程序員看的一個備忘錄,編譯完了之後就沒了,生成的指令裏的地址就只是地址。

這種備忘錄的意義,就是讓編譯器幫你記好每一個地址下的數據格式,為你減輕負擔。你一定要自找麻煩,那麼通用的指針變數是可以用的,void*就是。這種指針就不會記錄下面是什麼。你樂意一切都用void*,C語言(編譯器)完全不會反對。只要你能記住每一個指針下面應該是什麼類型的數據,你的程序同樣可以正常運行。

但是很顯然,正常人不會自找麻煩。全用void*除了自找麻煩,不會有任何一丁點的好處。


c語言是從彙編發展起來的,早期彙編的地址分為好幾種類型,所以就了類型指針,方便編譯器編譯。

後來發展到c++,類型指針,可以實現類似com組件的通用介面,實現多種設計模式。


指定基類型,只是你告訴編譯器,你要把指針指向的地址當作什麼來用,通用指針那就是 void * 了

色即是空,空即是色


推薦閱讀:
相關文章