無型別,又為抽象型別:沒有對應的實體,不能直接定義變數,但可以定義指標。
(1)失去指標指向的功能;
(2)p指標此時不具有+1的能力。(在gcc編譯器下,無型別指標課加1。)
void*是一種特別的指標,因為它沒有指向的型別,或者說不能根據這個型別判斷出指向物件的長度。void *指標具有以下特點:
1.任何指標(包括函式指標)都可以賦值給void指標;
type *p;///不需轉換
vp=p;只獲得變數/物件位址而不獲得大小
2.void指標賦值給其他型別的指標時都要進行轉換;
type * p=(type *)vp;//轉換型別也就是獲得指向變數/物件大小
3.void指標在強制轉換成具體型別前,不能解引用;
*vp//錯誤,因為void指標只知道,指向變數/物件的起始位址,而不知道指向變數/物件的大小(佔幾個位元組)所以無法正確引用
4.void指標不能參與指標運算,除非進行轉換。
(type*)vp++;//等價於:vp=vp+sizeof(type)
void*的作用:
強制型別轉換
有時候由於過載等的干擾,導致需要轉換成void *,來進行取位址。
例如,(void *)obj.member,就可以取到member的位址;直接&(obj.member)取到的實際上是obj的開始位址。
指向0的位址
(void *)0,指向全是0的位址,相當於null。
void*無型別指標的例項:
#include#includeusing namespace std;
typedef struct tag_st
st;int main()
無型別的指標
void malloc size t size 開闢一塊連續size位元組的空間引入 int a 3 int a int malloc 3 sizeof int int i for i 0 i 3 i a i i for i 0 i 3 i printf d a i free a int n,i p...
C 空指標與無型別指標
c 用0表示空指標,c用 void 0表示空指標,c 對null的定義 undef null in case has defined it.ifdef gnug define null null else g ifndef cplusplus define null void 0 else c de...
關於無型別指標的使用
今天在工作時發現程式有可以優化的地方,程式中本來有乙個結構體a,然後a這個結構體中包含了若干個結構體bcdef等等。本意是將這若干個結構體的資料通過socket傳送出去,原本每乙個結構體都會有乙個傳送函式,現在想將它優化成乙個傳送函式。那麼問題來了?這個函式的形參怎麼設定?指向結構體中的結構體的指標...