首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言數組名取地址深度解析:行指標與指標運算

     編輯:關於C

問題引入

int a[5] = {1,2,3,4,5};
int *p = (int *)(&a + 1);
printf("%d\n", *(p - 1));  // 輸出為何?

核心概念:&a 的型別

  • a:數組名,在多數上下文中退化為指向首元素的指標(int*)。
  • &a:取整個數組的地址,型別為 指向含 5 個 int 的數組的指標,即 int (*)[5](行指標)。

指標運算規則

&a + 1 會使指標前移 一個數組的大小,即 5 * sizeof(int) 位元組。結果指向緊隨數組 a 之後的記憶體位置(越界一個元素位置)。

強制轉型與解參考

int *p = (int *)(&a + 1);  // 轉為 int*,指向 a[5](越界位置)
*(p - 1)  // 向前移動一個 int 大小,落在 a[4],值為 5

驗證程式與輸出

#include 
int main() {
    int a[5] = {1,2,3,4,5};
    int *p = (int *)(&a + 1);
    printf("%p\n%p\nbit = %td\n", (void*)a, (void*)p, p - a);
    printf("%d\n", *(p - 1));
    return 0;
}

輸出結果

輸出顯示 p - a = 5,確認 &a + 1 跳過了 5 個 int。*(p-1) 即 a[4] = 5。

圖解記憶體佈局

索引:     0   1   2   3   4   5(越界)
數值:     1   2   3   4   5   *
a:       [1][2][3][4][5]
&a+1  ──────────────────────► *
p (int*) ──────────────────► *
p-1  ─────────────────────► 5

延伸:多維數組與行指標

對於 int a[3][4]:

  • a → int (*)[4](指向含 4 個 int 的數組)
  • a + 1 跳過一行(4 個 int)
  • &a + 1 跳過整個 3x4 數組(12 個 int)

總結

  1. &a 是行指標(int (*)[N]),+1 跨越整個數組。
  2. 轉為 int* 後,+1/-1 以 sizeof(int) 為步長。
  3. *(p-1) 等價於 a[N-1],常用於獲取數組尾元素。
  4. 嚴格說 &a + 1 指向的位置屬於「指向數組最後一個元素之後」的合法指標,可參與減法運算,但不可解參考。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved