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

C語言指針進階:數組指針與指針數組的本質區別

     編輯:關於C語言

一張圖搞懂「數組指針」vs「指針數組」

C 語言中 int (*p)[10] 和 int *p[10] 只差一對括號,卻代表完全不同的類型。本文從內存佈局、運算符優先級、實戰用法三個維度徹底釐清兩者區別,並給出判斷口訣。

核心定義對比

概念聲明語法含義類型sizeof(p)
數組指針int (*p)[10]指向「包含 10 個 int 的數組」的指針int (*)[10]指針大小(4/8 字節)
指針數組int *p[10]包含 10 個「指向 int 的指針」的數組int *[10]10 × 指針大小(40/80 字節)

運算符優先級口訣

() 優先級 > [] > *(解引用)

  • int (*p)[10]:() 先結合 *p → p 是指針 → [10] 說明指向的類型是「長度 10 的數組」。
  • int *p[10]:[] 先結合 p → p 是數組 → * 說明元素類型是指針。

內存佈局實測

int m[10];
int *p1 = m;       // 指向首元素,類型 int*
int (*p2)[10] = &m; // 指向整個數組,類型 int (*)[10]

printf("p1 = %p, p1+1 = %p\n", p1, p1+1);   // 差 4 字節(sizeof(int))
printf("p2 = %p, p2+1 = %p\n", p2, p2+1);   // 差 40 字節(sizeof(int[10]))

輸出示例:

p1 = 0x7ffe...fc, p1+1 = 0x7ffe...00  (差 4)
p2 = 0x7ffe...fc, p2+1 = 0x7ffe...28  (差 40)

實戰應用場景

1. 數組指針:處理二維數組、函數傳遞矩陣

void print_matrix(int (*mat)[4], int rows) { // 列數固定為 4
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < 4; j++)
            printf("%d ", mat[i][j]);
}

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
print_matrix(a, 3); // a 退化為 int (*)[4]

2. 指針數組:字符串陣列、不規則二維數組、main 參數

char *argv[] = {"prog", "arg1", "arg2"}; // 指針數組
int *rows[3]; // 每行長度不同
rows[0] = malloc(10 * sizeof(int));
rows[1] = malloc(20 * sizeof(int));
rows[2] = malloc(5 * sizeof(int));

快速判斷技巧:由內向外讀

  1. 找到標識符 p。
  2. 向右看:有 [] → 數組;無 → 繼續。
  3. 向左看:有 * → 指針。
  4. 重複直到遇到類型關鍵字(int 等)。

例:int (*p)[10]

  1. p 是標識符。
  2. 向右:) 結束,無 []。
  3. 向左:* → p 是指針。
  4. 跳出括號,向右:[10] → 指向「長度 10 的數組」。
  5. 向左:int → 元素類型。
  6. 結論:指向 int[10] 的指針。

常見錯誤避坑

  • 誤用 int *p[10] 接收二維數組:實際傳入 int a[3][4] 類型為 int (*)[4],類型不匹配會警告/報錯。
  • 忘記括號:int *p[10] 寫成 int (*p)[10] 含義完全反轉。
  • sizeof 誤區:對指針數組 sizeof(p) 返回整個數組大小;對數組指針 sizeof(p) 返回指針大小,需用 sizeof(*p) 獲取所指數組大小。

記住:數組指針是「指針」,指針數組是「數組」。括號位置決定了「誰修飾誰」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved