编写函数void mul(int *a,int *b,int *c, int m, int n,int p)
实现任意矩阵Amn.和Bnp相乘的结果为Cmp矩阵。为保证通用性用一维指针表示二维矩阵,其中int *a,int m,int n表矩阵Amn
int *b,int n,int p表矩阵Bnp
int *c,int m,int p表矩阵Cmp
用主函数检验正确性。
当我第一眼看到这题目时 ,我的第一反应是用二维指针传参,十分不能理解
“用一维指针表示二维矩阵” 这句话。
在这里,m,n,p的大小是不确定的,换言之,三个矩阵的大小也是不确定的。
“由编译器的寻址方式决定第二维不可省略”,在一个文章里看到这句话,意识到问题的所在,但是,为什么“第二维不可省略”?
二维数组在底层实际上是一个很长的一维数组,三维四维也都是一样。
我的理解是,系统要依据第二维将一维数组划定界限。所以,数组应该是大小确定的。
如果要满足题目的通用性要求,或许一维指针更为方便,
/
int matrixA[m][n],matrixB[n][p],matrixC[m][p];
int *a = &matrixA[0][0],*b= &matrixB[0][0],*c=&matrixC[0][0];
/
void mul1(int *a,int *b,int *c, int m, int n,int p){
int i,j,k;
int *a0 =a,*b0=b,*c0=c;
for (i = 0; i < m; i++)
{
for (j = 0; j < p; j++)
{
for (k = 0; k < n; k++)
{
c+=p*i+j;
a+=n*i+k;
b+=p*k+j;
*c += (*a) * (*b);
a=a0;b=b0;c=c0;
}
}
}
}
如果一开始的第二维确定的话,也可以使用二维指针传参。
/
int matrixA[m][2],matrixB[n][2],matrixC[m][2];
int (*pa)[2] = matrixA;int (*pb)[2] = matrixB;int (*pc)[2] = matrixC;
/
void mul2(int (*pa)[2],int (*pb)[2],int (*pc)[2], int m, int n,int p){
int i,j,k;
for (i = 0; i < m; i++)
{
for (j = 0; j < p; j++)
{
for (k = 0; k < n; k++)
{
pc[i][j] += (pa[i][k]) * (pb[k][j]);
}
}
}
}
表达的实在很混乱。
不如把有启发的文章罗列一下。
二维数组和二级指针(真的没什么关系) - 青儿哥哥 - 博客园
由typedef和函数指针引起的危机 - 青儿哥哥 - 博客园
从编译器角度理解C++中的引用和指针 - 青儿哥哥 - 博客园
[C语言]二维数组传参的格式(详细+总结)_思简行繁乃成的博客-CSDN博客_c语言二维数组传参
关于二维数组和指针与传参_Zwarwolf的博客-CSDN博客