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 >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。
最後更新:2017-04-03 05:40:19