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

C語言多維數組與指針深度解析

     編輯:關於C語言

核心認知:數組名與首地址

對於二維數組 char cs[2][3],以下四種表達式指向同一地址(首元素 &cs[0][0]):

p1 = &cs[0][0];
p2 = &cs[0];
p3 = &cs;
p4 = cs; // 最常用

但它們的類型不同,影響指針運算步長:

  • cs 類型 char (*)[3],+1 跨過一行(3 個元素)。
  • *cs 類型 char *,+1 移動一個元素。

訪問任意元素

int nums[2][3] = {{11,12,13},{21,22,23}};
int *p1 = &nums[0][2];           // 直接取地址
int *p2 = nums; p2 += 2;         // 利用首地址 + 偏移
// 兩者均指向 nums[0][2] (值 13)

遍歷二維數組

下標法(最直觀)

for (int i=0; i<2; i++)
    for (int j=0; j<3; j++)
        printf("%d\n", nums[i][j]);

一維指針線性遍歷

int *p = nums;
for (int i=0; i<6; i++)
    printf("%d\n", *(p+i)); // 或 *p++

利用 sizeof 計算總元素數

char cs[2][3] = {{'A','B','C'},{'D','E','F'}};
char *p = cs;
for (size_t i=0; i < sizeof cs / sizeof cs[0][0]; i++)
    printf("%c\n", *p++);

雙重指針解引用

for (int i=0; i<6; i++)
    printf("%c\n", *(*cs + i)); // *cs 為首行首地址

指針層級解析

char cs[2][3];
printf("%p, %p\n", cs, *cs);   // cs: 數組地址, *cs: 首行地址 (同值)
printf("%c, %c\n", **cs, cs[0][0]); // **cs 解引用兩次得首元素值

三維數組遍歷

char cs[2][2][3] = { {{'A','B','C'},{'D','E','F'}}, {{'1','2','3'},{'4','5','6'}} };

/* 方法 1:雙重解引用 + 偏移 */
for (int i=0; i < sizeof cs / sizeof cs[0][0][0]; i++)
    printf("%c\n", *(**cs + i));

/* 方法 2:轉為一維指針(推薦,清晰) */
char *p = (char *)cs;
for (int i=0; i < sizeof cs / sizeof cs[0][0][0]; i++)
    printf("%c\n", *p++);

關鍵類型對照表

表達式類型含義+1 步長
cschar (*)[3]指向含 3 元素的數組指針3 * sizeof(char)
*cschar *指向首元素sizeof(char)
**cschar首元素值N/A
&cschar (*)[2][3]指向整個二維數組整個數組大小

最佳實踐

  • 遍歷多維數組首選 轉為一維指針,邏輯清晰且無類型警告。
  • 函數參數傳遞二維數組需指定列數:void func(int arr[][3], int rows) 或 void func(int *arr, int rows, int cols) 配合一維索引 arr[i*cols + j]。
  • 避免在運行時動態確定維度的數組指針運算,改用扁平化一維數組 + 手動索引計算。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved