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

C 語言實作矩陣轉置:函式設計與指標運算完整範例

     編輯:關於C

程式碼完整實作

#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];  // 轉置核心:行列互換
}

關鍵技術點解析

1. 二維陣列指標參數宣告

  • int (*a)[4]:指向「含 4 個 int 的陣列」的指標,即二維陣列的行指標。第二維大小必須指定,編譯器才能計算行跨度。
  • 呼叫時直接傳陣列名 a,自動退化為 int (*)[4]。

2. 指標算術存取元素

  • *(a + i) 等價於 a[i](第 i 行,型別 int[4])。
  • *(*(a + i) + j) 等價於 a[i][j]。
  • (*(a + i) + j) 等價於 &a[i][j],可直接傳給 scanf。

3. 轉置邏輯

原陣列 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] 索引。
  • 大型矩陣轉置涉及快取未命中,可考慮分塊轉置優化效能。
  • C99 可使用 int n, m; int a[n][m]; 變長陣列(VLA)簡化參數傳遞。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved