在學習C/C++編程語言時,免不了和內存打交道,在計算機中,我們存儲有電影,文檔,音樂等數據,這些數據在內存中是以什么形式存儲的呢?下面做一下簡單介紹。
本文是學習VIPler的博文關於內存地址和內存空間的理解之后整理的,感謝VIPler提供學習資源。
1 內存地址
我們經常在書上或者網絡上看到4位和8位的內存地址表示方法,比如0x0001
或者0x00000001
,為什么會有這兩種區別呢?
其實,這兩種表示方法都是表示的編號為1的內存地址,都只是一個地址編號,指向(或者說)一個1字節的內存空間。
注意一點:
計算機存儲器的內存是以字節為基本單位,也即一個地址代表1個字節(8bit)的存儲空間。
比如如下表示:
[0x0000]------>[8bit空間]
[0x0001]------>[8bit空間]
[0x0002]------>[8bit空間]
[0x0003]------>[8bit空間]
或者
[0x00000000]------>[8bit空間]
[0x00000001]------>[8bit空間]
[0x00000002]------>[8bit空間]
[0x00000003]------>[8bit空間]
至於為什么會出現4位16進制地址0x0001和8位16進制地址0x00000001,是因為硬件所支持的尋址空間不同,有些CPU只能尋址16位(16根地址線),所以用4位十六進制表示地址就夠用了。有些CPU只能尋址32位(32根地址線),所以用8位十六進制。
2 內存空間
在計算機數據存儲中,無論是代碼還是數據,都會存儲在硬盤中,掉電不會丟失。硬盤容量大,但是數據傳輸速度較慢,與CPU的運行速度不匹配,所以在運行程序或打開數據時,首先會把數據從硬盤等存儲器上拷貝到數據傳輸速率較快的存儲器上,然后再送到CPU進行處理,這個中間存儲器就是內存。
(這就是為什么電腦開的進程多了,會卡,我們會想到換一個大一點的內存條。再卡就換固態硬盤。)
內存也是一種存儲器,也會有地址,這個地址就相當於家里的門牌號。
計算機把存儲在存儲器上的所有信息都數字化了,因為在計算機存儲中都是0和1的二進制。
下面通過兩個例子進行說明:
(1) 存儲漢字 “丁”,如下圖:
漢字在存儲中占兩個字節。計算機記住“丁”字的內存地址是0x1000(1000H)。其他的漢字也是類似的存儲。
第一行,是漢字本身,給人看的,
第二行,是計算機在存儲器中存儲“丁”字的真正存儲內容,0001001001110101在計算機中就代表“丁”字
第三行,是“丁”字在計算機中的內存地址
對於上面可以這樣理解,內存地址相當於一個門牌號。一個門牌號對應的家里有卧室,廚房,衛生間,客廳等不同房間,這些就相當於一個內存地址對應的8bit內存空間。
只有門牌號有編號,一家一個,家里的卧室等房間是沒有編號的(也即沒有內存地址)。
翻譯過來就是:一個內存地址對應一小塊內存,這塊內存存儲8bit數據。
(2)漢字占兩個字節,英文字母和阿拉伯數字占一個字節,以"A"為例
理解方法與“丁”字類似。
總結內存地址是內存中存儲數據的一個標識,並不是數據本身,通過內存地址可以訪問到對應內存中存儲的數據。