在C語言中處理二維數組時,常需要一個指針在自增後自動跳轉到下一行。例如給定數組 int a[3][2] = {{1,2}, {3,4}, {5,6}};,如何定義一個指針使得 ptr++ 後指向下一行的首元素?
二維數組在內存中按行主序連續存儲。數組名 a 的類型是「指向包含 2 個 int 的數組的指針」,即 int (*)[2]。因此 a + 1 會跨過整整一行(2 個 int)指向第二行。
int (*ptr)[2] = a; // ptr 指向第一行
ptr++; // ptr 移動到第二行
此時 *ptr 相當於 a[1],即第二行的首地址。若需訪問第 j 列元素,可用 (*ptr)[j] 或 *(*(ptr) + j)。
int *p = a[0]; 這是指向第一個元素的指針,p++ 只會在行內移動,無法自動換行。int **p; 這是指向指針的指針,不適用於靜態二維數組。#include <stdio.h>
int main() {
int a[3][2] = {{1,2}, {3,4}, {5,6}};
int (*ptr)[2] = a; // 定義行指針
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
printf("%d ", (*ptr)[j]); // 訪問當前行第 j 列
}
printf("\n");
ptr++; // 移動到下一行
}
return 0;
}
使用「指向一維數組的指針」即 int (*ptr)[N](N 為列數),配合 ptr++ 即可實現按行遍歷二維數組,這是 C 語言處理矩陣運算的標準技巧。