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

C語言二維陣列指標解析:a 與 *a 的地址相同但語意迥異

     編輯:C 語言問答

宣告與記憶體佈局

int a[3][4];  // 3 列、4 行,共 12 個 int,連續儲存

記憶體佈局(假設起始位址 0x1000,int 4 bytes):

a[0][0] a[0][1] a[0][2] a[0][3] | a[1][0] a[1][1] a[1][2] a[1][3] | a[2][0] a[2][1] a[2][2] a[2][3]
0x1000  0x1004  0x1008  0x100C     0x1010  0x1014  0x1018  0x101C     0x1020  0x1024  0x1028  0x102C

a、&a、a[0]、&a[0][0]、*a 的型別與值

運算式型別值(位址)語意
aint (*)[4](指向 4-int 陣列的指標)0x1000整個二維陣列的首位址(第 0 列)
&aint (*)[3][4](指向 3x4 陣列的指標)0x1000整個二維陣列的位址(型別不同,步長不同)
a[0]int *(退化為指向首元素)0x1000第 0 列首元素位址
&a[0][0]int *0x1000第一個元素位址
*aint *(等價於 a[0])0x1000第 0 列首元素位址

結論:`a`、`&a`、`a[0]`、`&a[0][0]`、`*a` **數值相同(0x1000)**,但**型別不同**,決定指標運算步長。

關鍵差異:a+1 vs *a+1

運算式型別結果位址跨越元素數
a + 1int (*)[4]0x1010跳過 1 列(4 個 int,16 bytes)
*a + 1 (即 a[0] + 1)int *0x1004跳過 1 個 int(4 bytes)

這是二維陣列指標運算的核心:**外層指標步長 = 內層陣列大小;內層指標步長 = 元素大小**。

實戰應用:函式參數傳遞

// 正確:接收列數固定的二維陣列
void print_row(int (*p)[4], int rows) {
    for (int i = 0; i < rows; ++i)
        for (int j = 0; j < 4; ++j)
            printf("%d ", p[i][j]);  // p[i] 相當於 *(p+i)
}

// 呼叫
print_row(a, 3);  // a 隱式轉為 int (*)[4]

若列數不固定,改用一維陣列模擬:`void print_flat(int *p, int rows, int cols)`,存取 `p[i*cols + j]`。

總結

  • `a` 是「指向列陣列的指標」,`*a` 是「指向列首元素的指標」。
  • 數值相同,**型別決定運算語意**。
  • 掌握「指標型別 = 步長」,二維/多維陣列指標不再迷茫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved