1. 程式人生 > >void*(指標)的型別轉換-專講

void*(指標)的型別轉換-專講

指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址所以不管你儲存的是int指標、float指標、long指標,對於儲存指標的記憶體來說都是分配同樣大小的記憶體的,這也為使用void指標可以儲存任意型別的指標打下了基礎但是注意在使用void指標,要將其強制轉換為具體的指標型別,詳解使用方式如下。 (說了就是地址,32位機子中任何一個指標的長度都是4個位元組,因為邏輯地址就佔用4位元組)

以下結果是基於VC++和VS2010的

1.C中對指標型別的轉換要求很低。但是這將留下一個很大的漏洞

[cpp]  view plain  
copy
  1. int*  a=Null;     
  2. void* b=Null;  
  3. char* c=Null;  
  4. c=a;    //warning C4133: “=”: 從“int *”到“char *”的型別不相容,但是編譯能通過  
  5. b=a;    //將void*和其他型別的指標相互賦值不會出現警告,這在C語言中是允許的
      
  6. c=b;  

2.C++中對型別要求很高,不允許不同型別指標之間的相互賦值,void指標例外(任何型別指標都可以賦值給void指標,但反之則不行)

[cpp]  view plain  copy
  1. int*  a=Null;     
  2. void* b=Null;  
  3. char* c=Null;  
  4. c=a;//出錯  
  5. b=a;//通過  
  6. c=b;//出錯  
如果要賦值必須 顯示轉換 [cpp]  view plain  copy
  1. int*  a=Null;  
  2. void* b=Null;  
  3. char* c=Null;  
  4. c=(char*)a;//通過   
  5. b=a;       //通過  
  6. c=(char*)b;//通過  

3.那麼C/C++中void指標的這一特性有什麼用呢?請看如下原始碼

[cpp]  view plain  copy
  1. void * __cdecl _memcpy_(void * dst, const void * src, size_t count)//當引數可以是任意型別指標的時候,就使用void*  
  2. {  
  3.     void * ret = dst;  
  4.   
  5.     while (count--)  
  6.     {  
  7.         *(char *)dst = *(char *)src;    //使用void*指標之前要進行強制轉換  
  8.         dst = (char *)dst + 1;  
  9.         src = (char *)src + 1;  
  10.     }  
  11.   
  12.     return(ret);  
  13. }