二维数组指针的赋值问题

想用二维数组指针完成数组赋值,可是不知道哪里错了

这个题目是求矩阵对角线的和

#include <stdio.h>
int main()
{
    int a[3][3] = { 0 }, i, sum=0;
    int dj(int(*)[3], int*);
    int(*p)[3] = a;
    int f = 0;
    int* b = &f;
    for (i = 0; i < 3; i++)
    {
        printf("请矩阵输入第%d行元素:", i + 1);
        scanf("%d %d %d",(*(p+i+1)+1), (*(p + i + 1) + 2), (*(p + i + 1) + 3));
    }
    sum = dj(p, b);
    printf("主对角线之和:%d", sum);
    printf("副对角线之和:%d\n", f);
    return 0;
}
int dj(int(*a)[3], int* b)
{
    int sum = 0, i, f = 0;
    for (i = 0; i < 3; i++)
    {
        sum += a[i][i];
    }
    for (i = 0; i <3; i++)
    {
        f += a[i][2 - i];
    }
    *b = f;
    return sum;
}

img

我的解答思路和尝试过的方法

赋值那里不用指针却可以运行

    for(i=0;i<3;i++)
    {
        printf("请矩阵输入第%d行元素:",i+1);
         scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
    }
我想要达到的结果

数组计数从0开始
比如int a[3];
a[0]=a+0;
a[1]=a+1;
a[2]=a+2;

scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]); 中的空格去掉

    for(i=0;i<3;i++)
    {
        printf("请矩阵输入第%d行元素:",i+1);
         scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
    }

不大理解"对角线"的意思(还是说你的输出结果不对)
按我的理解进后代码即建议如下
(代码比较冗长,请见谅)

#include <stdio.h>

#define ARRAY_LENGTH  3  //矩阵边长  array->数组

void GetDiagonal(int[ARRAY_LENGTH][ARRAY_LENGTH], int*, int*);    //函数声明放外面更容易区分   diagonal->对角线

int main()
{
    //变量
    int array[ARRAY_LENGTH][ARRAY_LENGTH] = { 0 };
    int major = 0, minor = 0;   //majior->主 minor->次

    //输入
    for (int i = 0; i < ARRAY_LENGTH; i++) //局部变量就让它呆里面好了, 对了,数组是从0开始计数的哦
    {
        for (int j = 0; j < ARRAY_LENGTH; j++)
        {
            printf("请输入第%d行第%d列元素:\t", i+1, j+1);
            scanf_s("%d",&array[i][j]);  //我个人认为p+i不如p[i]来的直观,代码毕竟是来读而不是来炫的对吧,而且极有可能漏掉一个‘&’
            //我用的是高版本,_s指安全版本
        }
    }

    //计算
    GetDiagonal(array, &major, &minor);

    //列出
    printf("\n\n您输入的数组为:\n");
    for (int i = 0; i < ARRAY_LENGTH; i++)
    {
        for (int j = 0; j < ARRAY_LENGTH; j++)
            printf("%d\t", array[i][j]);
        printf("\n");
    }


    //输出
    printf("主对角线之和:%d\n", major);   //我猜你说的是 ↖↘ 方向的对角线
    printf("副对角线之和:%d\n", minor);
    return 0;
}


/// <summary>
/// 计算对角线(当然,你可以直接把这个移到main()中,只要改一改就行)
/// </summary>
/// <param name="array">将数组传入</param>
/// <param name="pmajor">主对角线于此传出</param>
/// <param name="pminor">副对角线于此传出</param>
void GetDiagonal(int array[ARRAY_LENGTH][ARRAY_LENGTH], int* pmajor, int* pminor)
{
    for (int i = 0; i < ARRAY_LENGTH; i++)
    {
        //主对角线
        *pmajor += array[i][i];  //pmajor指向major,此处直接为major赋值

        //副对角线
        *pminor += array[ARRAY_LENGTH - i - 1][i];  //同一行,不过是从行末开始
    }
}