对用行指针进行矩阵相乘操作的运行结果看不太明白

我想知道输入俩个三行三列矩阵,矩阵进行相乘操作,用行指针实现的原理

矩阵相乘,结果矩阵的第i行j列的元素就是矩阵a的i行成语矩阵b的j列的元素和。
代码如下,如有帮助,请帮忙采纳一下,谢谢。

img

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j,t;
    int **a,**b;
    int c[3][3];
    a = (int **)malloc(sizeof(int*)*3);
    b = (int **)malloc(sizeof(int*)*3);
    //给数组赋值
    for (i=0;i<3;i++)
    {
        a[i] = (int*)malloc(sizeof(int)*3); 
        b[i] = (int*)malloc(sizeof(int)*3); 
        for (j=0;j<3;j++)
        {
            a[i][j] = i;
            b[i][j] = i+1;
        }
    }

    //打印数组a
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    //打印数组b
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
        {
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }

    //矩阵相乘
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
        {
            c[i][j] = 0; //c[i][j] 是数组a的i行和数组b的j列对应数据相乘后的和
            for(t = 0;t<3;t++)
                c[i][j] += (*(a+i))[t] * b[t][j];  //(*(a+i)) 就是a的第i+1行指针
            printf("%4d",c[i][j]);
            
        }
        printf("\n");
    }
    //释放指针
    for (i=0;i<3;i++)
    {
        free(a[i]);
        free(b[i]);
        a[i] = 0;
        b[i] = 0;
    }
    free(a);
    free(b);
    return 0;
}