![](/img/trans.png)
[英]C++: How to get the address of a float pointer and convert it to void**
[英]C++ how to get the address stored in a void pointer?
我如何獲取指針指向的值的內存地址? 就我而言,這是一個空指針。 只是將其分配給一個uint會給我這個錯誤:
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
謝謝!
std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.
@謝保羅
我認為在此特定問題中將void*
轉換為size_t
就足夠了,原因有以下三個:
發問者沒有指定他是否想要便攜式解決方案。 他說,這與他合作。 我不知道這到底意味着什么,但對我來說很明顯,他正在Windows或其他系統上以保護模式運行IA-32。 這意味着將指針轉換為整數是該系統上的已定義操作,即使標准C ++未定義該操作也是如此。
其次,我建議首先把指針int
這是litb顯然是毫無意義和jalf我看了。 我更正了我犯的錯誤,然后將int
替換為size_t
。
最后,我努力尋找與您提議的標准解決方案相關的內容。 不幸的是,我找不到任何相關的東西。 我有以下參考資料: ANSI ISO IEC 14882 2003 。 我認為Sellibitze指出這將是即將到來的標准的一部分。 我真的不了解C,顯然C99引入了這種完美的解決方案。 我希望有人向我展示C ++的可移植解決方案。
拜托,不要猶豫糾正我的錯誤,我仍然是uni的學生:)
謝謝,
C和C ++ 中的指針是某種抽象形式的內存地址的體現。 您可以通過以下方式獲得指針的特定於實現的字符串解釋:
printf ("%p", voidPointer);
另一種方法是將其強制轉換為intptr_t:
(intptr_t) voidPointer;
C ++中的NULL指針定義為等於“ 0”,因此,在上述操作中,您大概會得到(intptr_t)0的等值值。 但是,這仍然取決於您,並且您必須將任何特定於實現的知識都解釋為內存地址。
關鍵是,在使用奇怪的內存模型的平台(例如16位x86 DOS編譯器)中,其段具有偏移量的段作為其內存模型,可以用多種方式來解釋指針。 在原始地址表示中,NULL可以是DS:0或SS:0,而不僅僅是純0。
您需要強制轉換-一個reinterpret_cast
(首選):
UInt32 address = reinterpret_cast<UInt32>( voidPointer );
或C樣式的強制轉換(不建議使用):
UInt32 address = (UInt32)voidPointer;
您可以使用sprintf()獲取地址的字符串表示形式,或使用%p格式說明符通過printf()顯示它,例如:
printf( "%p", voidptr ) ;
如果只希望地址執行指針算術運算,則將其強制轉換為適當的具體數據類型指針,否則按照建議將其強制轉換為整數。
在C ++中,我可以使用以下命令打印指向的地址:
cout << "Address: " << ((unsigned)my_ptr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.