2009-01-04 251 views

回答

39

指向void的指針,void*可以指向任何對象:

int a = 5; 
void *p = &a; 

double b = 3.14; 
p = &b; 

你不能間接引用,增加或減少該指針,因爲你不知道你點什麼類型。這個想法是,void*可以用於像memcpy這樣的功能,它們只是複製內存塊,並不關心它們複製的類型。

+0

waw - 我不知道你不能增加一個void *!謝謝! – xtofl 2009-01-04 18:37:51

+0

不少編譯器會讓你 - 他們假設所有指針類型都是32位。這是錯誤的,但在Windows上常見的人們假設32位x86。 – 2009-01-04 21:26:09

4

這只是一個普通的指針,用來傳遞數據時,你不知道類型的一些例子。您必須將其轉換爲正確的類型才能使用它。

2

這是一個指向的任何東西 - 只是你可以玩的一塊內存 - 可能是一個對象,可能是一個字符。你必須施展才能做任何有用的事情。

2

Building off my prior posting...


注意:這裏所有的內存地址都是虛構的。我只是讓他們來說明一個觀點。


考慮:

int data[] = {10,11,12}; 

我們現在有:

0xffff0000-0xffff0003 with a value of (int)(10) 
0xffff0004-0xffff0007 with a value of (int)(11) 
0xffff0008-0xffff000b with a value of (int)(12) 

(我打算進入大端VS little-endian字節順序在這裏。)我們有:

int * p = data; 

我們現在有另一個內存位置的其他地方,說:

0xaaaa0000-0xaaaa0003 with a value of (int*)0xffff0000 

我們可以使用P [1] [或*(P + 1)]是指*(INT *)( 0xffff0004)[= 11],因爲sizeof(int)= 4,0xffff0000 + sizeof(int)= 0xffff0004。

如果我們有:

void * v = data; 

我們現在有另一個內存位置的其他地方,說:

0xbbbb0000-0xbbbb0003 with a value of (void*)0xffff0000. 

但是,無效沒有任何相關的sizeof()的信息。我們不能增加或減少指針。我們無法解引用訪問存儲在0xffff0000中的數據。我們只能將該值用作原始內存地址。

如果我們想要使用存儲在(void *)0xffff0000中的數據,我們首先需要將其轉換爲適當的類型。

這就是說,(void *)作爲將地址傳遞給任意數據結構的手段仍然非常有用。例如,memset()。無論我是否將struct tmstruct sockaddr置零。我們只需要一個指向結構體和它的大小的指針。

(這不用說,但是...用memset零出一個類的實例當心,並在這樣做,覆蓋虛擬指針表。)

1

空指針不能指向類成員在C++中。