我想使用另一个函数来打印数组的内容。 当我运行代码时,我得到“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_ROWS
和N_COLS
在我的main
函数中,我声明了我的数组,然后调用函数
{
int Array[N_ROWS][N_COLS] = { {1,2,3},{4,5,6},{7,8,9} };
display(&Array);
}
我的参数类型不是int(*)[3][3]
还是我遗漏了什么?
答案 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>