指向2D数组的指针如何在引擎盖下工作?

时间:2019-02-13 04:58:27

标签: c pointers arrayofarrays pointer-to-array

我不明白为什么应该执行矩阵乘法的这段代码会出错。

输入:2x2个矩阵,两个矩阵中都有元素1,2,3,4

预期输出: 7 10 15 22

此代码给出的输出: 15 22 12 16

int a[10][10], b[10][10], c[10][10], i, j, k, r1, c1, r2, c2;

int (*pa)[10][10] = &a, (*pb)[10][10] = &b, (*pc)[10][10] = &c;

for ( i = 0; i < r1; i++) {
    for(j = 0; j < c2; j++) {
         *pc[i][j] = 0;
        for(k = 0; k < c1; k++) {
            *pc[i][j] += *pa[i][k] * *pb[k][j];
        }
    }
}

我尝试使用此类打印语句进行调试,结果如下:

给定2x2矩阵,它们具有1,2,3,4作为元素时,将产生以下错误:

at 00 of a is 3
at 00 of b is 1
Elements you're multiplying: 3  1

但是预期的输出是这样的:

at 00 of a is 1
at 00 of b is 1

(其余元素似乎相同) 此处未粘贴的其余代码均无错误。使用打印语句对其进行了彻底检查。

1 个答案:

答案 0 :(得分:0)

请先参考以下答案:

Pointer address in a C multidimensional array

Create a pointer to two-dimensional array

一起回答您的问题。这是您的代码的有效版本(简单版本):

#include<stdio.h>

void main()
{
    int a[2][2]={{1,2},{3,4}};
    int b[2][2]={{1,2},{3,4}};
    int c[2][2], i, j, k, r1=2, c1=2, r2=2, c2=2;

    int (*pa)[2] = a, (*pb)[2] = b, (*pc)[2] = c;

    for ( i = 0; i < r1; i++) 
    {
        for(j = 0; j < c2; j++) 
        {
            pc[i][j] = 0;
            for(k = 0; k < c1; k++) 
            {
                pc[i][j] += pa[i][k] * pb[k][j];
            }
        }
    }
    for(i=0;i<2;i++)
    {
        printf("\n");
        for(j=0;j<2;j++)
        {
            printf("%d\t",c[i][j]);
        }
    }

}