为什么这个2d指针符号有效,而另一个没有

时间:2016-05-15 11:10:53

标签: 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);
}

1 个答案:

答案 0 :(得分:3)

如果您正在撰写

 int (*mat)[3]

这意味着mat是一个指向3 int s。

数组的指针

另一方面,

int *mat[3]

表示mat是一个3 int * s(指向整数的指针)的数组。

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

现在,您可以理解,您的评论// pointer to a 2d array不正确。