形参int (*a)[N]和int a[][N]在编译时都被解释为“a是指向长度为N的一维数组的指针”,所以函数体内的操作可以二者完全一样。就是说如果你这个函数是正确的的话,把第一个形参改为int (*a)[N],其余不变就是完全正确的。所以这没有什么新的意义,这里就不费笔墨了。至于改为形参int *a,那得稍费周折,因为int *a是个一级指针,不能接受二维数组的全部信息,要在函数中作点预处理;调用的地方也要做点处理。举例如下:
#include "stdio.h"#define N 10
void Transpose(int *a,int n){
int i,j,b[N][N],*p[N]
for(j=i=0i<Np[i++]=a+j,j+=n)//处理一下指针,以便操作方阵
for(i=0i<ni++){
for(j=0j<nj++){
scanf("%d",&p[i][j])//输入矩阵a
b[j][i]=p[i][j]//转置为b
}
}
printf("\n转置后的矩阵为:\n")
for(i=0i<ni++){
for(j=0j<nj++)
printf("%d ",p[i][j]=b[i][j])//改写a为转置后的矩阵
printf("\n")
}
}
int main(void){
int a[N][N],n
printf("输入转置矩阵的n=")
scanf("%d",&n)
printf("请输入一个%dx%d的矩阵\n" ,n,n)
Transpose((int *)a,n)//这里对指针a要强制为与函数形参类型一致
return 0
}
//经过vc6调试成功void transferMat(int a[] , int b[], int n) //a表示待转置的矩阵,b表示输出矩阵,n表示元素个数
{
int i,j
for(i=0i<ni++)
for(j=0j<nj++)
{
b[j,i]=a[i,j]
}
}