二维数组传参

编写函数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博客

[C语言]二维数组传参的格式(详细+总结)_思简行繁乃成的博客-CSDN博客_c语言二维数组传参

二维数组传参 实例详解_匠在江湖的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值