函數參數聲明 int Sum(int arr[][3]) 合法,但 int Sum(int arr[3][]) 非法。核心在於 C 語言數組在內存中的**線性佈局**與**編譯器地址計算**。
二維數組在內存中按行連續存儲:
arr[0][0], arr[0][1], arr[0][2], arr[1][0], arr[1][1], arr[1][2], ...
訪問 arr[i][j] 時,編譯器生成代碼計算偏移:
offset = (i * COLS + j) * sizeof(int)
COLS (列數/第二維大小) **必須在編譯期已知**,否則無法計算跨行偏移。ROWS (行數/第一維大小) **不參與地址計算**,只影響總大小檢查,故可省略。int Sum(int arr[][3])
// 等價於
int Sum(int (*arr)[3]) // arr 是指向「包含 3 個 int 的數組」的指針
編譯器知道每個「行」大小固定為 3 * sizeof(int),故 arr + i 正確跳過整行。
編譯器無法確定行大小,無法生成 arr[i][j] 的訪問代碼,導致編譯錯誤。
void func(int arr[][COLS]) 或 void func(int (*arr)[COLS])。void func(int arr[][3], int rows)。int **arr 或扁平一維數組 int *arr = malloc(rows * cols * sizeof(int)),自行計算索引 arr[i*cols + j]。理解「行大小參與地址計算」是掌握 C 語言多維數組參數傳遞的關鍵。