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

C 語言基礎教程(四):指向固定大小陣列的指標——宣告語法、指標算術與二維陣列應用

     編輯:C 語言基礎

宣告語法:括號決定結合優先序


int (*p)[3];   /* p 是「指向 3 個 int 陣列」的指標 */
int *p[3];     /* p 是「3 個指向 int 的指標」陣列 (指標陣列) */
/* 差異在於 () 強制 * 優先於 [] 結合 */

指標算術:步長 = 陣列總大小

  • int (*p)[3]; → sizeof(*p) = 3 * sizeof(int) = 6 bytes (16-bit 環境)。
  • p + 1 位址遞增 6 bytes,指向下一個「3-int 陣列」。
  • 對比:int *q; → q + 1 遞增 2 bytes (單一 int)。

處理二維陣列的實戰優勢


int a[3][4];
int (*p)[4] = a;   /* p 指向「4-int 陣列」,完美匹配 a 的列型別 */

p = a + 1;         /* p 指向第 1 列 */
*p[0]  或  **p     /* 存取 a[1][0] */

*p[0] + 2          /* 存取 a[1][2] */
*(p + i) + j       /* 存取 a[i][j] */

完整範例:靈活走訪二維陣列


int a[3][4] = {
    {1,  3,  5,  7},
    {9, 11, 13, 15},
    {17, 19, 21, 23}
};

int main(void)
{
    int i, (*b)[4];
    b = a + 1;                 /* b 指向第 1 列 */
    for (i = 1; i <= 4; b = b[0] + 2, ++i)  /* 每次跳 2 元素 */
        printf("%d\t", *b[0]);               /* 輸出 9, 13, 17, 21 */
    printf("\n");

    for (i = 0; i < 2; ++i) {
        b = a + i;             /* 每次跳 1 列 */
        printf("%d\t", *(b[i] + 1)); /* 輸出 a[0][1]=3, a[1][1]=11 */
    }
    printf("\n");
    return 0;
}
/* 輸出:
9   13  17  21
3   11  19
*/

關鍵差異總結

宣告名稱+1 步長典型用途
int *p;指向 int 的指標sizeof(int)一般指標、字串、動態陣列
int (*p)[N];指向 N-int 陣列的指標N * sizeof(int)二維陣列列指標、矩陣運算
int *p[N];N 個 int 指標的陣列sizeof(int*)指標陣列、不規則二維陣列

現代 C 實務

  • 固定行數二維陣列:優先用 int (*p)[COLS],型別安全、指標算術直覺。
  • 動態行數:用扁平化 int *p = malloc(rows * COLS * sizeof(int)); + 封裝巨集 AT(p, r, c)。
  • C++:std::vector> 或 std::mdspan (C++23)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved