回覆列表
-
1 # C語言答疑課堂
-
2 # 思逸安
陣列本來就是棧,是一片連續的固定記憶體區域,這是最原始的設定,因為陣列中的元素就是按照這個規定存放的,所以相鄰得陣列元素差距一個型別大小的空間
-
3 # 不會不知道
一個是邏輯上的概念一個是物理概念。
打個比方,有一個四米長的過道,均勻的放了四把椅子,編號0到3,0號和1號,地址差一,0號座位的起點到1號座位的起點的物理間距長度是一米。
現在,把四個座位減少為兩個,每個椅子變兩倍大,編號為0和1,座位號差為一,但物理長度間距差變為2。
也就是說,以物理地址(記憶體)來計算的話,是用相差的單位(椅子的編號)乘以你椅子的長度。
決定椅子長度的是你的資料型別,但是從執行時定址來說依然是拿相差的單位乘以資料長度。
很簡單的一段C語言程式碼,定義了一個一維陣列,陣列有3個元素。
第一個printf先輸出了第一個元素和第二個元素的地址;
第二個printf輸出了第一個元素的地址和第二個元素的地址的地址差,執行結果如下:
正如題主所言,第一個元素的地址是22feb4,第二個元素的地址是22feb8。兩者相減,也就是 22feb8 - 22feb4 應該等於 4 才對啊,為何是1?
其實編譯器做了一個處理,也就是在22feb8 - 22feb4 時多了一個步驟,如下:
(22feb8 - 22feb4) / sizeof(int) = (22feb8 - 22feb4) / 4 = 1
看到沒?你看上去好像是22feb8 - 22feb4,其實多了一個除以 sizeof(int)的步驟。
在C語言中,地址相減並不是取地址之間間隔多少個位元組,而是取地址之間間隔多少個元素,而一個元素可能佔用多個位元組。
我再問下,如果程式碼中的陣列arr不是int型別,而是char型別,或者是float型別,那麼結果又是多少?