2011-08-27 97 views
2

內存地址如何工作?C++內存地址?

在32位內存地址是一個十六進制值,如0x0F032010,對不對?但是,這些值指向字節或位?

和兩個內存地址之間是什麼樣的像0x0F032010和0x0F032011

+1

請相信我,我的朋友,真正理解你將不得不遲早閱讀一些沉重的書。來自SOF的四行答案不會讓你走得更遠... 我最喜歡的操作系統書籍作者:Tannenbaum。您也可以從Silberschatz,Galvin,Gagne開始 –

+2

兩個內存地址之間沒有任何內容,這就是爲什麼使用浮點值進行指針算術會給我編譯錯誤的原因! GRR! – Marlon

+1

也許一堆亞原子粒子? :P –

回答

10

在32位的內存地址是一樣的0x0F032010十六進制值,對不對?

它是一個數字。內存中的位置。它以記憶的開始和結束爲界,記憶開始於某個值並以某個值結束。

但是,這些值指向字節或位?

通常認爲地址指向最小的可尋址單元,這是一個字節。大多數現代CPU都是這樣定義的。但情況並非總是如此。

而像0x0F032010和0x0F032011

龍兩個內存地址之間是什麼樣的。或者什麼也沒有,因爲它們之間沒有任何東西。

+8

+1自1992年以來,那裏沒有龍。正式。 – MByD

1

在C和C++中,地址最終指向的內容大小與char相同 - 「字節」。這是語言中的處理級別。這是否真的是機器中的尋址水平是另一個問題。一個字節中的位數是另一個問題。該標準指定了一個最小值。

0

這些值本身沒有任何意義,只是數字。內存地址只是一個對應於內存字節的數字,比如你家的街道地址。這只是一個數字。

地址可以指向的最小單位是一個字節,所以地址指向字節;你可以考慮指向你房子左側的地址;實際的房子(組成該字節的位)在你的地址(指向你房子的左側)和你的隔壁鄰居的地址(指向他房子的左側)之間。但是在那裏沒有任何其他地址。

1

C++(或C)地址或指針值最好被認爲是指向一個對象,而不是(必然)指向一個字節。指針運算是根據指向對象的大小定義的,因此遞增int*值會爲您提供一個指向相鄰對象(可能位於內存更遠處的4個字節)的指針。

在機器級上,假設一個典型的線性單片字節尋址內存模型,指針被實現爲機器地址,每個地址實際上是一個指向單個字節的數字。一個int*指針值包含它指向的int對象的第一個字節的地址。通過將sizeof (int)(比如4)加到機器地址來實現遞增C++ int*指針。

就C++而言,指針不是整數;他們只是指針。您可以使用強制轉換來在指針值和整數值之間進行轉換,並且結果應該對於底層機器的內存模型而言是有意義的,但對結果的保證不會太多。您可以對指針執行算術運算,但是在語言級別上,它與整數運算完全不同(儘管它可能在計算機級別上以縮放整數算術實現)。

我描述的內存模型不是唯一可能的,並且C和C++都是故意設計的,以允許其他模型。例如,你可以有一個模型,其中每個單獨的對象都有自己的內存空間,而指針或地址是一個複合值,它由標識該對象的東西加上該對象內的偏移量組成。給定int x; int y;,您可以比較他們的地址是否相等(&x == &y將爲false),但&x < &y的行爲未定義;甚至不需要&x < &y&y < &x具有相反的值。

C++內存模型在典型的32位平面內存模型上工作得非常好,你可以將指針看作數字。但是C++模型足夠抽象,它也可以在其他模型之上工作。

您可以根據語言定義的抽象術語或機器實現的具體術語思考指針和地址。他們完全不同,但最終是兼容的心智模式。同時保持他們在你的頭上可能會很棘手。