淺談void指針的類型轉換問題

 

指針是一個特殊的變量,它裏面存儲的數值被解釋成爲內存裏的一個地址。 (說白了就是地址,32位機子中任何一個指針的長度都是4個字節,因爲邏輯地址就佔用4字節)
以下結果是基於VC++和VS2010的
1.C中對指針類型的轉換要求很低。但是這將留下一個很大的漏洞
int*  a=Null;    void* b=Null;char* c=Null;c=a;    //warning C4133: “=”: 從“int *”到“char *”的類型不兼容,但是編譯能通過b=a;    //將void*和其他類型的指針相互賦值不會出現警告,這在C語言中是允許的c=b;

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

int*  a=Null;    void* b=Null;char* c=Null;c=a;//出錯b=a;//通過c=b;//出錯 如果要賦值必須顯示轉換int*  a=Null;void* b=Null;char* c=Null;c=(char*)a;//通過    b=a;       //通過c=(char*)b;//通過

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

void * __cdecl _memcpy_(void * dst, const void * src, size_t count)//當參數可以是任意類型指針的時候,就使用void*{    void * ret = dst;     while (count--)    {        *(char *)dst = *(char *)src;    //使用void*指針之前要進行強制轉換        dst = (char *)dst + 1;        src = (char *)src + 1;    }     return(ret);}4.小心使用void指針

按照ANSI(American National Standards Institute)標準,不能對void指針進行算法操作,即下列操作都是不合法的:
void * pvoid; 
pvoid++; //ANSI:錯誤 
pvoid += 1; //ANSI:錯誤 
//ANSI標準之所以這樣認定,是因爲它堅持:進行算法操作的指針必須是確定知道其指向數據類型大小的。 (  對於自增自減,我們得根據數據類型大小增減地址大小,以指向下(上)一個元素  )
//例如: 
int *pint; 
pint++; //ANSI:正確(pint其實是加了4)
但是大名鼎鼎的GNU(GNU's Not Unix的縮寫)則不這麼認定,它指定void *的算法操作與char *一致。
因此下列語句在GNU編譯器中皆正確:
pvoid++; //GNU:正確 
pvoid += 1; //GNU:正確 


5.小結每天進步一點點!(下面的亂碼一直弄不掉,求指教。。。)
--------------------- 
作者:爬金字塔的人 
來源:CSDN 
原文:https://blog.csdn.net/u012771236/article/details/23363623 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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