我正在閱讀Ogre3D實現中的一些代碼,我不明白void *
類型變量的含義。在C++中指向void
的指針是什麼?在C++中指向void的指針?
回答
指向void的指針,void*
可以指向任何對象:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
你不能間接引用,增加或減少該指針,因爲你不知道你點什麼類型。這個想法是,void*
可以用於像memcpy
這樣的功能,它們只是複製內存塊,並不關心它們複製的類型。
這是一個指向內存中某個點的原始指針。它不允許像char *或int *這樣的指針運算。
這裏的用法
這只是一個普通的指針,用來傳遞數據時,你不知道類型的一些例子。您必須將其轉換爲正確的類型才能使用它。
這是一個指向的任何東西 - 只是你可以玩的一塊內存 - 可能是一個對象,可能是一個字符。你必須施展才能做任何有用的事情。
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 tm或struct sockaddr置零。我們只需要一個指向結構體和它的大小的指針。
(這不用說,但是...用memset零出一個類的實例當心,並在這樣做,覆蓋虛擬指針表。)
空指針不能指向類成員在C++中。
- 1. C++ void指針
- 2. C#void指針?
- 3. 綁定void *指向C++/Cli基本類型指針的指針
- 4. 在C++中投射一個指向易失性void **的指針
- 5. 指向C中的指針的指針
- 6. 指向字符指針的void-pointer指針
- 7. C++強制指針指向指向基指向指針的指針
- 8. 指針的大小,指向C中指針的指針
- 9. C++ - 指向數組的指針 - 指針
- 10. C++指向指針的指針
- 11. 指向C++指針的指針
- 12. C++如何獲得一個指向lambda函數的void指針?
- 13. C++指定指向指針
- 14. 在C++中刪除void *指針
- 15. 使用void指針在C++中打印數組我使用void指針
- 16. void指針
- 17. C++指向類的指針
- 18. C++指向類的指針
- 19. 指向int的指針。 C++
- 20. 包裝void指針在C++/CLI和C#
- 21. 類的指針void *
- 22. C中的void指針傳遞結構
- 23. 什麼是C++中的void指針?
- 24. void *指針上的指針運算
- 25. 是否可以在C++中聲明指向模板函數的void指針?
- 26. 返回void的C++/C函數指針*
- 27. void函數中的指針
- 28. 指向c中的結構的指針
- 29. 指向c中的數組的指針
- 30. 指針指向託管C++
waw - 我不知道你不能增加一個void *!謝謝! – xtofl 2009-01-04 18:37:51
不少編譯器會讓你 - 他們假設所有指針類型都是32位。這是錯誤的,但在Windows上常見的人們假設32位x86。 – 2009-01-04 21:26:09