写一函数,将一个3x3的整型矩阵转置

写一函数,将一个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;
}

写一函数,将一个3x3的整型矩阵转置

原文地址:https://www.cnblogs.com/cyuyanchengxu/p/13386191.html