天天看點

C/C++下void*類型指針介紹       對函數傳回值以及參數的限制:     友善通用函數的設計:    友善記憶體操作:

           寫c/c++程式經常會遇到void*類型的指針,以前對于這種指針沒有去深究,隻要程式可以正常運作就得過且過了,今天在網上搜了一些資料,才算是對這個void*類型指針有了更多的認識。

           void*顧名思義就是不指向任何對象的指針,也被稱為通用指針或者是泛型指針。也是c語言下“純粹位址”(raw address)的一種約定。void*僅僅訓示一個位址,但是因為其不指向任何類型的對象,是以當得到一個void*類型指針指向的一段記憶體時,并不能直接使用void*指針對該記憶體進行操作,而必須用相應的類型指針來操作:比如該段記憶體時一段字元串,那麼可以用char*來進行操作。

        之是以設計出void*這種類型的指針,設計者的主要思路我想估計有一下這麼兩個:

   對函數傳回值以及參數的限制

   友善通用函數的設計

   友善記憶體操作

        在c/c++下申明的函數如果沒有傳回值,那麼就必須将其的傳回類型設定為void,這是因為如果不标明其傳回類型,那麼編譯器會預設其傳回類型是int,是以需要用void來進行限定。

        另外就是在c++下,如果向一個沒有參數的函數傳入參數時,編譯器會報錯,這也是因為該函數的參數的void。

        如果一個函數是針對各種類型的資料都适用的時候,這個時候就應該适用void*類型作為參數,因為首先void*類型的指針可以轉換為各種類型的指針,然後再針對這些具體類型做進一步操作。當然很多人會說,其實傳入char*指針也可以實作這種功能。确實可以,但是這樣會造成不必要的誤會,讓使用者以為這個函數隻能對字元串進行處理,而不是适用各種函數。

        我們經常使用到的記憶體複制和指派函數就都是以void*為指針:

        void*指針最重要的的作用我想還是進行記憶體操作。一段記憶體裡可能含有各種不同資料類型,如果要将一段記憶體共享或者發送給其他主機時,以void*類型的指針來代表該段記憶體是最好的選擇。

        還是以這兩個函數為例,這兩個函數都涉及到記憶體操作,都無一例外地使用void*類型作為參數類型也證明了這一點。值得注意的是,在傳入一個void*類型的指針的時候,通常還需要傳入一個int型的參數作為該段記憶體的大小,如以上兩個函數的len和num,這裡的len和num訓示的長度是byte。雖然在void*不支援任何數學操作,但是一個void對象其實和char一樣,代表一個byte。

繼續閱讀