Q:编写一个函数实现对该矩阵的转置。
#include<iostream>
#include<cstdio>
using namespace std;
void InputMatrix(int (*a)[4],int n,int m) {
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
printf("%d",*(a+i)+j);
}
void OutputMatrix(int (*b)[4],int n,int m) {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++)
printf("%d",*(*(b+i)+j));
printf("\n");
}
}
void MatrixTranspose(int (*a)[4],int *(b)[3]) {
for(int i=0;i<4;i++) {
for(int j=0;j<3;j++)
b[i][j]=a[j][i];
}
}
int main()
{
int a[3][4],b[4][3];
cout<<"input 3X4 matrix"<<endl;
InputMatrix(a,3,4);
MatrixTranspose(a,b);
cout<<"the Transposex Matrix is"<<endl;
OutputMatrix(b,4,3);
getchar();
return 0;
}
上述有点问题。
总结:
对于上述的函数参数中,形参都包含了一个指向二维数组的指针变量,例如 int (*a)[4]、int (*b)[4],因为此处的被调函数要对主函数中定义的二维数组进行修改,因此不能像4.6中介绍那样用 int *a 或者 int a[]的形式作为形参。
对于一个二维数组a[m][n],数组名a代表指向二维数组第一行的指针(地址),a+1则指向二维数组第2行的指针。因此a+i指的是指向二维数组的第i+1 行的指针。它并不指向一个整型变量,而是指向一个整形的一位数组。
因此作为二维数组指针的传递,实参可以是数组名,但是形参一定是如 (*a)[n] 的形式。其中,n表示该二维数组每行的元素个数,即列数。所以,int (*a)[4]表示:指向一个包含4个元素的一维数组。
下面是比较简单的实现方法。
#include <stdio.h>
#define MAX 100
int main()
{
int m, n;
int i, j;
int a[MAX][MAX];
// 输入n阶矩阵
scanf("%d", &n);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
}
// 输出装置后的矩阵
for(i = 0; i < n; i++)
{
for(j = 0 ; j < n; j++)
{
printf("%d", a[j][i]);
if(j == n - 1) printf("\n");
else printf(" ");
}
}
return 0;
}