2013-10-12 56 views
1

這可能很明顯,但是,void指針可以安全地指向另一個指針嗎?即指向一個類型爲int *可以將一個void指針安全地指向annother指針嗎?

int i = 5; 
int *ip = &i; 
void *vp = &ip; 

int *nip = *(int **)vp; 
int ni = *nip; // == 5? 

編輯:對不起,也許我沒有說清楚,我想知道,如果一個空指針可以指向的內存部分擁有另一個指針的類型;而不是虛空**。只是無效*

+0

'INT *夾= * VP;'應該是'INT *夾= VP;' – ouah

+0

不,這將是超級明顯的問題,感謝您的貢獻,雖然。 – jayjay

+0

'INT *夾= * VP;'在這種情況下,答案是顯而易見的:你不能取消引用'無效*'。期。 – ouah

回答

5

是的,你可以將任何對象的指針轉換爲void *,並回到原來的指針類型而不會丟失信息。

從馬的嘴:

(C99,6.3.2.3p1)「中的孔隙的指針可被轉換成或從一個指針到任何不完整的或對象類型的指針,任何不完整的或對象。類型可能被轉換爲void指針並返回;結果應與原始指針相等。「

+0

是的但它可以「點」另一個指針? – jayjay

+1

它可以指向任何東西;指針沒有什麼特別之處。 – Dolda2000

+2

@jayjay'void *'可以指向任何對象:所以'int'或'int *'或者甚至是'int **'。 – ouah

2

是的,它可以指向任何對象類型。你不能真正提領一個空指針,因爲編譯器不知道它背後的「真實」的類型。但指點方面很好。

C11 6.3.2.3 Pointers /1來自:

作廢的指針可以被轉換或從一個指針到任何對象類型。指向的任何對象類型都可以被轉換爲void和返回的指針;結果應與原始指針相等。


1/「對象類型」不包括的功能,規則轉換函數指針略微更多的限制。

+4

*是的,它可以指向任何類型的*它可以指向任何*對象類型*。不保證保存函數指針類型。 – ouah

+0

關於強制轉換'const'類型的編輯已被回滾。如果你沒有注意到,這是一個C問題,而不是C++問題。 – paxdiablo

相關問題