#include <stdio.h>
void reverse(int (*a)[4], int (*b)[3]);
void Output(int (*b)[3], int n, int m);
void Input(int (*a)[4], int n, int m);
int main()
{
int a[3][4], b[4][3];
Input(a, 3, 4);
printf("輸出資料 a[3][4]:\n");
Output(a, 3, 4);
reverse(a, b);
printf("輸出資料 b[4][3]:\n");
Output(b, 4, 3);
return 0;
}
void Input(int (*a)[4], int n, int m)
{
int i, j;
printf("請輸入 3*4 個資料:");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", (*(a + i) + j)); // 等價於 &a[i][j]
}
void Output(int (*b)[3], int n, int m)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%d\t", *(*(b + i) + j)); // 等價於 b[i][j]
printf("\n");
}
}
void reverse(int (*a)[4], int (*b)[3])
{
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 3; j++)
b[i][j] = a[j][i]; // 轉置核心:行列互換
}
int (*a)[4]:指向「含 4 個 int 的陣列」的指標,即二維陣列的行指標。第二維大小必須指定,編譯器才能計算行跨度。a,自動退化為 int (*)[4]。*(a + i) 等價於 a[i](第 i 行,型別 int[4])。*(*(a + i) + j) 等價於 a[i][j]。(*(a + i) + j) 等價於 &a[i][j],可直接傳給 scanf。原陣列 a[3][4](3 行 4 列)→ 目標陣列 b[4][3](4 行 3 列)。
核心賦值:b[i][j] = a[j][i],其中 i 遍歷目標行(0..3),j 遍歷目標列(0..2),對應源陣列的列與行。
請輸入 3*4 個資料:1 2 3 4 5 6 7 8 9 10 11 12
輸出資料 a[3][4]:
1 2 3 4
5 6 7 8
9 10 11 12
輸出資料 b[4][3]:
1 5 9
2 6 10
3 7 11
4 8 12
rows、cols 並在函式內以 a[i*cols + j] 索引。int n, m; int a[n][m]; 變長陣列(VLA)簡化參數傳遞。