Как работает указатель на 2D массив под капотом? - PullRequest
0 голосов
/ 13 февраля 2019

Я не могу понять, почему этот фрагмент кода, который должен выполнять умножение матриц, работает неправильно.

Ввод: 2x2 матрицы с элементами 1,2,3,4 в обеих матрицах

Ожидаемый результат: 7 10 15 22 * ​​1009 *

Вывод, полученный этим кодом: 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 голосов
/ 13 февраля 2019

Сначала обратитесь к этим ответам:

Адрес указателя в многомерном массиве C

Создание указателя на двумерный массив

Оба вместе ответят на ваш вопрос.Вот рабочая версия вашего кода (простая версия):

#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]);
        }
    }

}
...