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(" "); } } 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(" "); else printf(" "); } } return 0; }