C語言 記憶體和位址

2022-03-19 10:28:50 字數 1798 閱讀 8005

在介紹指標之前,先讓我來講一講計算機記憶體與位址。計算機記憶體可以看作是一輛火車,我們知道火車有很多節車廂,每一節車廂都有車廂編號(坐過火車的人都知道),每一節車廂就可比喻為計算機的一塊記憶體,車廂裡面有座位號,通過座位號就可以唯一的確定乙個座位,座位號就好在這乙個記憶體塊的偏移量,通過它可以唯一確定的資料儲存的位置。

注意,記憶體中的每個位置由乙個獨一無二的位址標識,記憶體中的每個位置都包含乙個值。

現在舉例說明記憶體中資料儲存,如下表,表中加粗邊框部分表示記憶體中實際儲存的資料,無邊框部分表示記憶體單元的位址。

110

-1

16

1234567890

10000

10008

仔細的人也許會看到,對-1或16只佔了兩個位元組,可粗略看作為short int型別資料, 110在記憶體中佔了4個位元組,可粗略看作是int型別,而1234567890則可粗略看作是浮點型資料,所以應該了解雖然是同樣一塊位址,也可能存放不同型別的資料。

如果你能記住乙個值的儲存位址,你就可能根據這個位址取得這個值。但是要記住所有這些位址實在是太笨拙了(因為記憶體的位址並不像上表中表示的那麼簡單),所以高階語言所提供的特性之一就是通過名字而不是位址來訪問記憶體的位置。下面這張表與上表相同,但這次使用名字來代替位址。ab

cdef

110

-1

16

1234567

10000

10008

從上表中可以看出,當位址抽象成我們比較容易接受的名字時,對程式設計來說就變得簡單,這些名字就是傳說中的變數。不過有一點非常重要,你必須記住,名字與記憶體位置之間關聯並不是硬體所提供的,它是由編譯器為我們實現的。所有的這些變數給了我們一種更方便的方法記住位址——硬體仍然通過位址訪問記憶體位置

好了,我們再來看看上面的兩張表,我有乙個問題,對於變數e中儲存的內容到底代表乙個值還是乙個位址呢?

問題很簡單,不能確定。

例1:int a = 110;  

int *e = &a;

例1中e代表乙個位址,這個位址指向了整型變數a。

例2int e = 10000;

例2中e則代表乙個值。

我們已經知道定義變數時需要型別,編譯器實現了變數與記憶體位置之間關聯,那變數的型別又是幹什麼呢?變數名相當於幫我們找到了那個記憶體,而變數型別則告訴編譯器從變數所指向的那個記憶體位置起取幾個位元組。如int a =110; 則是從10000(a對應記憶體位址)起取4個位元組,所以從10000到10003這段位址就是變數a儲存的空間,從而變數a共有232個取值。

而short int b = -1;代表從10004開始取sizeof(short int)個位元組,也就是10004、10005這2個位元組。其他的可以以此類推。

針對型別我們可以這樣理解,還是拿坐火車為例,當乙個出行的時候,買一張票就可以,這種情況相當於(char型別);某一天剛好和女朋友出去旅遊,買一張票顯然不夠了,就得買2張票(short int型別);如果乙個宿舍4個人準備去旅遊顯示就得4張票(int,float型別);以此類推。火車相對不同的人不同需求分配座位,記憶體同樣根據不同的變數分配不同的記憶體空間。理解了這些,對於複雜的型別如陣列、結構體、聯合體變數的定義記憶體分配就明白了。

C語言記憶體位址

任務清單 c語言在記憶體中一共分為5個區域 記憶體棧區 存放區域性變數名 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,函式呼叫結束後釋放記憶體空間。通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內建立,在離開作用域後自動銷毀的變數的儲存區。通常是區域性變數,函...

C語言記憶體位址基礎(ZZ)

從計算機記憶體的角度思考c語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成乙個位元組陣列,記憶體中每乙個位址表示 1 位元組。比方說我們的電腦有 4k 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...

C語言記憶體位址對齊詳解

什麼是位址對齊?現代計算機中記憶體空間都是按照位元組 byte 劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排列,這就是對齊。為什麼要位址對齊?對齊的...