c - 为什么这个二维指针表示法有效而另一个无效

标签 c arrays pointers matrix

这里我编写了一段代码来打印 3x3 矩阵的对角线值之和。这里我必须将矩阵传递给函数。矩阵被传递给指针数组。代码可以工作,但问题是我必须按以下方式编写参数

int (*mat)[3]

以下导致程序崩溃

int *mat[3]

我想知道两者有什么区别?为什么第二个会导致程序崩溃?

完整代码:

#include<stdio.h>

int main(){

    int mat[3][3];
    int i,j;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            printf("input row %d column %d = ",i+1,j+1);
            scanf("%d",&mat[i][j]);
            printf("\n");
        }

    }


    // task 1 : Display sum of diagonal values
    diagonal_sum(mat);

}

diagonal_sum(int (*mat)[3]){  // pointer to a 2d array

    printf("\n    DIAGONAL SUM    \n");
    int sum=0;
    int i;
    for(i=0;i<3;i++){
        sum+=*(*(mat+i)+i);  // access the diagonal values of the matrix
    }

    printf("\ndiagonal sum is = %d \n",sum);
}

最佳答案

如果你正在写

 int (*mat)[3]

这意味着mat是一个指向3个int数组的指针。

另一方面,

int *mat[3]

意味着,mat是一个由3个int *组成的数组(指向整数的指针)。

显然这两个是不同的类型。所以,你的指针算术出错了。

现在,您可以理解,您的注释//指向二维数组的指针是不正确的。

关于c - 为什么这个二维指针表示法有效而另一个无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37293582/

相关文章:

c - 链表实现上的结构指针

javascript - 如何在 chrome 控制台中递归探索数组

arrays - 如何在AS3中制作2D矢量

c - 递归函数返回难以理解的答案

android - GCC 6 移位溢出错误,

FFFFFF转十进制值(C语言)

Java,将hashMap转换为数组或空数组

C 数组指针递增

c - 如何比较 switch-case 中的枚举值?

Javascript:将函数指针放入对象中?