当我将指针传递给函数时,将指针取消引用的指针不起作用。为什么? (C)

时间:2019-11-13 22:19:16

标签: c

我尝试了一切可能想到的。我不知道我是否缺少明显的东西。为什么起作用:

#include<stdio.h>

void test_matrix(int** matrix)
{
    for(int i=0; i<4; i++) {
        for(int j=0; j<4; j++) {
            printf("%d ", *(matrix+j+4*i));
        }
    }
    /**
    for(int i=0; i<4; i++) {
        for(int j=0; j<4; j++) {
            printf("%d ", *(*(matrix+i)+j));
        }
    }
    */
}
int main()
{
    int matrix[4][4];
    for(int i=0; i<4; i++)
        for(int j=0; j<4; j++)
            scanf("%d", &matrix[i][j]);
    test_matrix(matrix);
}

但是注释的部分不起作用。我也尝试了matrix [i] [j],但仍然无法正常工作。我的程序超时。 编辑:我添加了在MAIN中调用的函数。

1 个答案:

答案 0 :(得分:2)

错误是此2D数组的布局为4 x 4 = 16个整数。但是您的函数需要一个指向指针的指针。

正确的是在呼叫站点提供matrix的地址作为参数。但是不同于一些评论者所说的,它不是指向int数组的指针。

要正确处理2D数组的此地址,您需要告诉它您的功能,如下所示:

int

或类似这样:

void test_matrix(int (*matrix)[4])
{
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", *(*(matrix + i) + j));
        }
    }
}

您使用哪种访问方式都没有关系,有时只是口味的问题。这些表达式是等效的,实际上void test_matrix(int matrix[][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { printf("%d ", matrix[i][j]); } } } p[i]的语法糖:

*(p + i)

注1:正如一些评论者已经建议的那样,您应该将警告级别提高到最大并更正源,直到处理完所有诊断为止。

注2:当数组的尺寸大小发生变化时,您需要考虑一种将这些大小告知函数的方法。