2012-10-04 46 views
1

我想下面的代碼:C++指針VS數組和指針鑄造

unsigned long * foo = (unsigned long *) 0x200000; 

所以,按照我的理解,FOO指向unsigned long類型0x200000。現在,如果我嘗試,

std::cout<<foo[0]; 

我想這應該打印值0x200000(可能是小數)。因爲,foo[0] = *(foo + 0) = 0x200000。 但是,它實際上打印0

我在這裏失蹤了什麼?

回答

5

你誤會,

unsigned long * foo = (unsigned long *) 0x200000; 

解釋0x200000作爲unsigned long的地址。由於這是極不可能的是一個unsigned long,你可以在你的程序合法訪問的地址,

std::cout<<foo[0]; 

幾乎可以肯定是不確定的行爲,並有可能導致段錯誤。在你的情況,不過,訪問一個內存位置沒有造成段錯誤和有解釋和印刷爲unsigned long位,他們正好是全0

+0

你和'地址'是什麼意思? – NGambit

+0

錯字,本來應該是_地址,雖然地址可能會更好。 –

+1

也可以說明可能的修正,例如: unsigned long bar = 0x200000; unsigned long * foo = &bar; 請注意,在這種情況下,應該注意foo指針不在範圍之外複製,超出範圍和懸空。操作符可能會從刷新操作符&的解除引用操作符*和地址中獲益。 – WeirdlyCheezy

0
type * pointerName = addressItPointsTo; 

pointerName[0]是一樣*pointerName,意味着提領指針並在它指向的地址處獲取值。它恰好是0,但它通常會導致分段錯誤。

+0

它對'unsigned long * foo =&0x200000;'有什麼反應?將'0x200000'作爲一個編譯時常量,就像在同一場景中的字符串文字一樣,還是會以某種方式失效?你需要一個'const'嗎? (現在不能測試) – Ghost2

+0

@ Ghost2製作一個簡單的程序,自己試試。看看編譯如何說明獲取常量的地址。 – texasbruce