不兼容的参数类型?

时间:2016-03-23 00:07:19

标签: c arrays function

我想使用另一个函数来打印数组的内容。 当我运行代码时,我得到“IntelliSense:类型的参数”int(*)[3] [3]“与”int *(*)[3]“

类型的参数不兼容

这是我的功能:

void display(int *p[N_ROWS][N_COLS]) {
    int i, j;
    for (i = 0; i < N_ROWS; i++) {
        for (j = 0; j <N _COLS; j++) {
            printf("%i", p[i][j]);
        }
    }
}

我定义了N_ROWSN_COLS 在我的main函数中,我声明了我的数组,然后调用函数

{
    int Array[N_ROWS][N_COLS] = { {1,2,3},{4,5,6},{7,8,9} };
    display(&Array);
}

我的参数类型不是int(*)[3][3]还是我遗漏了什么?

2 个答案:

答案 0 :(得分:4)

display的原型不正确,以及您的调用语法:您定义display以获取指向int的2D数组,而您只需要一个2D数组int,当您将指针传递给main中您想要传递数组的数组时,将其作为指向其第一个元素的指针进行衰减。

这是一个更简单的版本:

void display(int p[N_ROWS][N_COLS]) {
    int i, j;
    for (i = 0; i < N_ROWS; i++) {
        for (j = 0; j < N_COLS; j++) {
            printf("%i", p[i][j]);
        }
    }
}

但请注意,上面p可以包含任意数量的行,原型中会忽略N_ROWS,相当于void display(int (*p)[N_COLS])

另请注意,您的printf将输出矩阵值而不会有任何分离。这可能不是你的意图。

来自main

{
    int Array[N_ROWS][N_COLS] = { {1,2,3},{4,5,6},{7,8,9} };
    display(Array);
}

答案 1 :(得分:3)

  

在你的问题的评论中已经解释了很多这个问题。

您对display的定义:

void display(int*p[N_ROWS][N_COLS])
{

这表示p将是指向N_ROWS的数组N_COLS的数组int

致电display时:

int Array [N_ROWS][N_COLS] = { {1,2,3},{4,5,6},{7,8,9} };
display(&Array);

您正在传递Array的地址,因此它是指向N_ROWS的数组N_COLS的数组int的指针。

使display的定义与您调用它的方式相匹配:

void display(int (*p)[N_ROWS][N_COLS])
{

括号首先使*p相关联。由于p是指向int数组数组的指针,因此转到int需要额外的解引用:

printf("%i\n", (*p)[i][j]);

定义display以获取指向数组的指针意味着数组的大小绑定到type参数,因此display确切地知道数组的维度。

另一种方法是定义display以将数组的维度作为第二个参数。

void display(int p[][N_COLS], int n_rows)
{

在这种情况下,p参数是指向N_COLS的数组int的指针。在大多数表达式中使用时,数组T 将衰减为类型指向T 的指针,该值等于其第一个元素的地址。因此,您可以像这样调用第二版display

int Array [N_ROWS][N_COLS] = { {1,2,3},{4,5,6},{7,8,9} };
display(Array, N_ROWS);

第二种方法的优点是display可以使用少于或多于N_ROWS的数组。缺点是调用者可以传入正确的行数。

您可能认为以下声明会为您提供完整的类型安全性:

void display(int p[N_ROWS][N_COLS])
{

但是,C中用于函数参数的数组语法会导致p的大小信息被忽略,并且等同于int p[][N_COLS],后者又被视为int (*p)[N_COLS]。< / p>