写一函数,将一个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:
");
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("
");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", p[i][j]);
}
free(p[i]); // 释放二级指针中每个一级指针申请的空间
printf("
");
}
free(p);//释放总体二级指针的空间
system("pause");
return 0;
}