回覆列表
  • 1 # C語言答疑課堂

    很簡單的一段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型別,那麼結果又是多少?

  • 2 # 思逸安

    陣列本來就是棧,是一片連續的固定記憶體區域,這是最原始的設定,因為陣列中的元素就是按照這個規定存放的,所以相鄰得陣列元素差距一個型別大小的空間

  • 3 # 不會不知道

    一個是邏輯上的概念一個是物理概念。

    打個比方,有一個四米長的過道,均勻的放了四把椅子,編號0到3,0號和1號,地址差一,0號座位的起點到1號座位的起點的物理間距長度是一米。

    現在,把四個座位減少為兩個,每個椅子變兩倍大,編號為0和1,座位號差為一,但物理長度間距差變為2。

    也就是說,以物理地址(記憶體)來計算的話,是用相差的單位(椅子的編號)乘以你椅子的長度。

    決定椅子長度的是你的資料型別,但是從執行時定址來說依然是拿相差的單位乘以資料長度。

  • 中秋節和大豐收的關聯?
  • 大眾朗逸是如何登上緊湊型轎車銷量之王寶座的?