void*(指標)的型別轉換-專講
阿新 • • 發佈:2019-01-06
指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址,所以不管你儲存的是int指標、float指標、long指標,對於儲存指標的記憶體來說都是分配同樣大小的記憶體的,這也為使用void指標可以儲存任意型別的指標打下了基礎,但是注意在使用void指標,要將其強制轉換為具體的指標型別,詳解使用方式如下。 (說白了就是地址,32位機子中任何一個指標的長度都是4個位元組,因為邏輯地址就佔用4位元組)
以下結果是基於VC++和VS2010的
1.C中對指標型別的轉換要求很低。但是這將留下一個很大的漏洞
[cpp] view plain- 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指標,但反之則不行)
[cpp] view plain copy- 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指標的這一特性有什麼用呢?請看如下原始碼
[cpp] view plain copy- 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);
- }