1. 程式人生 > >關於void型別指標-----void*、void**

關於void型別指標-----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 * 以定義一個指標變數,但不說明它指向哪一種型別資料.
1. 傳參:通用型別

可以作為函式模板,連結串列等引數的通用引數。在使用時,只需要強制型別轉換就可以。

2.強制型別轉換

有時候由於過載等的干擾,導致需要轉換成void *,來進行取地址。

例如,(void *)obj.member,就可以取到member的地址;直接&(obj.member)取到的實際上是obj的開始地址。

3.指向0的地址

(void *)0,指向全是0的地址,相當於NULL。
非void型別顯式轉換為void型別表示式,用於避免一些程式碼靜態檢查工具的警告。