1. 程式人生 > >C/C++下void*型別指標介紹

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 * memcpy(void *dest, const void *src, size_t len); 
void * memset ( void * buffer, int c, size_t num ); 

    方便記憶體操作:

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

<span style="font-size:14px;">void * memcpy(void *dest, const void *src, size_t len); 
void * memset ( void * buffer, int c, size_t num ); </span>
        還是以這兩個函式為例,這兩個函式都涉及到記憶體操作,都無一例外地使用void*型別作為引數型別也證明了這一點。值得注意的是,在傳入一個void*型別的指標的時候,通常還需要傳入一個int型的引數作為該段記憶體的大小,如以上兩個函式的len和num,這裡的len和num指示的長度是byte。雖然在void*不支援任何數學操作,但是一個void物件其實和char一樣,代表一個byte。