寫一函數,將一個3x3的整型矩陣轉置
解題思路: 矩陣轉置就是行變列,列變行,說白了就是 arry[i][j] 轉換為 arry[j][i] ; 但是需要注意的是,
一. 因為行列個數可能並非相同,轉換后行數或者列數變多了或者變少,因此不能直接轉換。需要重新申請空間存儲轉換后的數據。
二. 二維數組是線性扁平化存儲的,無法確定列數的情況下傳參后,在函數中使用時需要頭指針向后偏移 列數*第n行 才能訪問到第n行的數據。例如在函數中訪問 arry[i][j] ,需要通過arry + col_num*i + j 方式進行訪問。
答案:
#include <stdio.h>
int **transform(int **arry, int row_count, int col_count)
{
//列變行,行變列,則行的個數是以前列的個數,列的個數是以前行的個數
int **p = NULL;
//矩陣中有多少行,取決於以前有多少列,然后申請地址空間
p = (int **)malloc(sizeof(int *) * col_count);
for (int i = 0; i < col_count; i++) {
//一行中有多少列,取決於以前有多少行,然后申請空間
p[i] = (int *)malloc(sizeof(int) * row_count);
}
for (int i = 0; i < col_count; i++) {
for (int j = 0; j < row_count; j++) {
//二維數組的存儲是扁平化的, 訪問第j行第i列的數據,應該是 arry + j*列數 + i
//j是新數組的列,但是是源數組的行
p[i][j] = (arry + col_count * j)[i];
}
}
return p;
}
int main()
{
int arry[3][4];
printf("Please enter a 3 x 4 matrix: \n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
scanf_s("%d", &arry[i][j]);
}
}
int **p = transform(arry, 3, 4);
printf("\n");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", p[i][j]);
}
free(p[i]); // 釋放二級指針中每個一級指針申請的空間
printf("\n");
}
free(p);//釋放總體二級指針的空間
system("pause");
return 0;
}