关于C语言的一个矩阵相乘程序中一维二维数组的问题

来源:百度知道 编辑:UC知道 时间:2024/06/16 10:46:46
#include "stdio.h"
void trmul( a, b, m, n, k, c)
int m, n, k;
double a[], b[], c[];
{
int i, j, l, u;
for( i=0; i<m; i++ )
for( j=0; j<k; j++)
{
u=i*k+j;
c[u]=0.0;
for( l=0; l<n; l++ )
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
}

main()
{ int i,j;
static double a[4][5]={ {1.0,3.0,-2.0,0.0,4.0},
{-2.0,-1.0,5.0,-7.0,2.0},
{0.0,8.0,4.0,1.0,-5.0},
{3.0,-3.0,2.0,-4.0,1.0}};
static double c[4][3],b[5][3]={ {4.0,5.0,-1.0},
{2.0,-2.0,6.0},{7.0,8.0,1.0},
{0.0,3.0,-5.0},{9.0,8.0,-6.0}};
trmul(a,b,4,5,3,c);
for (i=0; i<=3; i++)
{ for (j=0; j<=2; j++)
printf("%13.7e ",c[i][j]);
printf("\n");
}
printf(&

因为在C语言中,数组名的实质是数组的首地址。main函数中调用trmul函数的一句 trmul(a,b,4,5,3,c); 的意思是将数组a b c的首地址作为函数的实参赋予对应的形参
void trmul( a, b, m, n, k, c)
int m, n, k;
double a[], b[], c[];
这里的a b c了。
以第一个数组为例来说明:
在主函数中a是一个二位数组名,及a是一个具有20个元素的二位数组的首地址,调用函数时trmul(a,b,4,5,3,c); 将a的值(20个元素的首地址)作为函数的实参赋予对应的形参 void trmul( a, b, m, n, k, c)
int m, n, k;
double a[], b[], c[];
这里的a 了。因为子函数中的a是一维数组名(实质是指针变量 数组名仍然是数组首地址)所以对主函数中的20个元素,从子函数的角度看就是具有20个元素的一维数组,当然也可以看成4行5列的元素。

虽然为数组,但是c里面都是当指针来处理的,我看trmul函数里面对a和b的取值也是作为二维数组的取值方法取值的

例如a[9][9]可以看做横向10,深度10的一个矩阵,当b[9];b = a的时候,实际上相当于你将深度首地址赋给了b.不会崩,但结果注定不对

C语言编译对形式参数数组大小不做检查的!

我有一个用java写的stassen算法来求矩阵相乘的,比较复杂,但是是参考《算法导论》写的,好像效率要高一些。