void指針(void *的用法)

指針有兩個屬性:指向變量/對象的地址長度
但是指針只存儲地址,長度則取決於指針的類型
編譯器根據指針的類型從指針指向的地址向後尋址
指針類型不同則尋址範圍也不同,比如:
int*從指定地址向後尋找4字節作爲變量的存儲單元
double*從指定地址向後尋找8字節作爲變量的存儲單元

1.void指針是一種特別的指針
   void *vp
   //說它特別是因爲它沒有類型
   //或者說這個類型不能判斷出指向對象的長度

2.任何指針都可以賦值給void指針
   type *p;
   vp=p;
   //不需轉換
   //只獲得變量/對象地址而不獲得大小

3.void指針賦值給其他類型的指針時都要進行轉換
   type *p=(type*)vp;
   //轉換類型也就是獲得指向變量/對象大小
轉:http://icoding.spaces.live.com/blog/cns!209684E38D520BA6!130.entry

4.void指針不能復引用
   *vp//錯誤
   因爲void指針只知道,指向變量/對象的起始地址
   而不知道指向變量/對象的大小(佔幾個字節)所以無法正確引用

5.void指針不能參與指針運算,除非進行轉換
   (type*)vp++;
   //vp==vp+sizeof(type)


什麼時候使用void指針?

當進行純粹的內存操作時,或者傳遞一個指向未定類型的指針時,可以使用void指針。void指針也常常用作函數指針。

有些C代碼只進行純粹的內存操作。在較早版本的C中,這一點是通過字符指針(char *)實現的,但是這容易產生混淆,因爲人們不容易判斷一個字符指針究竟是指向一個字符串,還是指向一個字符數組,或者僅僅是指向內存中的某個地址。

例如,strcpy()函數將一個字符串拷貝到另一個字符串中,strncpy()函數將一個字符串中的部分內容拷貝到另一個字符串中:
    char  *strepy(char'strl,const char *str2);
    char  *strncpy(char *strl,const char *str2,size_t n);   
    memcpy()函數將內存中的數據從一個位置拷貝到另一個位置:
    void  *memcpy(void *addrl,void *addr2,size_t n);
   
    memcpy()函數使用了void指針,以說明該函數只進行純粹的內存拷貝,包括NULL字符(零字節)在內的任何內容都將被拷貝。請看下例:
    #include "thingie.h"    /* defines struct thingie */
    struct thingie *p_src,*p_dest;
    /*  ...  */
    memcpy(p_dest,p_src,sizeof(struct thingie) * numThingies);

在上例中,memcpy()函數要拷貝的是存放在structthingie結構體中的某種對象op_dest和p_src都是指向structthingie結構體的指針,memcpy()函數將把從p_src指向的位置開始的sizeof(stuctthingie) *numThingies個字節的內容拷貝到從p_dest指向的位置開始的一塊內存區域中。對memcpy()函數來說,p_dest和p_src都僅僅是指向內存中的某個地址的指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章