我想下面的代碼:C++指針VS數組和指針鑄造
unsigned long * foo = (unsigned long *) 0x200000;
所以,按照我的理解,FOO指向unsigned long類型0x200000。現在,如果我嘗試,
std::cout<<foo[0];
我想這應該打印值0x200000
(可能是小數)。因爲,foo[0] = *(foo + 0) = 0x200000
。 但是,它實際上打印0
。
我在這裏失蹤了什麼?
我想下面的代碼:C++指針VS數組和指針鑄造
unsigned long * foo = (unsigned long *) 0x200000;
所以,按照我的理解,FOO指向unsigned long類型0x200000。現在,如果我嘗試,
std::cout<<foo[0];
我想這應該打印值0x200000
(可能是小數)。因爲,foo[0] = *(foo + 0) = 0x200000
。 但是,它實際上打印0
。
我在這裏失蹤了什麼?
你誤會,
unsigned long * foo = (unsigned long *) 0x200000;
解釋0x200000作爲unsigned long
的地址。由於這是極不可能的是一個unsigned long
,你可以在你的程序合法訪問的地址,
std::cout<<foo[0];
幾乎可以肯定是不確定的行爲,並有可能導致段錯誤。在你的情況,不過,訪問一個內存位置沒有造成段錯誤和有解釋和印刷爲unsigned long
位,他們正好是全0
type * pointerName = addressItPointsTo;
pointerName[0]
是一樣*pointerName
,意味着提領指針並在它指向的地址處獲取值。它恰好是0,但它通常會導致分段錯誤。
它對'unsigned long * foo =&0x200000;'有什麼反應?將'0x200000'作爲一個編譯時常量,就像在同一場景中的字符串文字一樣,還是會以某種方式失效?你需要一個'const'嗎? (現在不能測試) – Ghost2
@ Ghost2製作一個簡單的程序,自己試試。看看編譯如何說明獲取常量的地址。 – texasbruce
你和'地址'是什麼意思? – NGambit
錯字,本來應該是_地址,雖然地址可能會更好。 –
也可以說明可能的修正,例如: unsigned long bar = 0x200000; unsigned long * foo = &bar; 請注意,在這種情況下,應該注意foo指針不在範圍之外複製,超出範圍和懸空。操作符可能會從刷新操作符&的解除引用操作符*和地址中獲益。 – WeirdlyCheezy