下面是我的代码,我将名为a的数组传递给显示函数,该函数只显示数组。
我在此声明invalid type argument of type unary *
printf("Arr[%d][%d] is %d\n",i,j,*(*(q+i)+j));
错误
但是,注释代码会正确打印值。你能解释一下我做错了什么吗?我是C的新手,请原谅我,如果这是一个愚蠢的错误/错误。
#include <stdio.h>
void display(int *, int, int);
int main()
{
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
display(a,3,4);
/*
int i,j;
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
printf("Arr[%d][%d] is %d\n",i,j,*(*(a+i)+j));
}
*/
return 0;
}
void display(int *q, int row, int col)
{
int i,j;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
printf("Arr[%d][%d] is %d\n",i,j,*(*(q+i)+j));
}
}
答案 0 :(得分:2)
解决此问题的另一种方法是显式传递数组的地址并将其取消引用(display()
)所需的结果,但也可以在没有额外的间接级别的情况下实现({{1 }}):
display1()
更新:这至少需要一个兼容C99的编译器。
答案 1 :(得分:1)
在现代C中,您应首先传递尺寸的尺寸
void display(size_t row, size_t col, int (*q)[col]);
然后您可以像q
一样正常使用q[i][j]
,并为您完成所有索引计算。
void display(size_t row, size_t col, int (*q)[col]) {
for(size_t i=0; i<row; i++) {
for(size_t j=0; j<col; j++)
printf("Arr[%zu][%zu] is %d\n", i, j, q[i][j]);
}
}
这需要在leas C99上工作。
答案 2 :(得分:0)
通常,要将2D
数组传递给函数,您需要为除第一个维度以外的所有维度指定数组维度,因此在此示例中,您需要[4]
作为最后一个维度,但您可以选择省略第一个维度,即
void display( int (*q)[4], int row, int col)
并在上面声明如下
void display(int (*)[], int, int);
答案 3 :(得分:0)
你唯一的问题是你打电话给显示器的方式。您需要在传递数组时删除索引并修复显示的初始定义以匹配:
#include <stdio.h>
void display(int q[][4], int, int);
int main()
{
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
display (a, 3, 4);
return 0;
}
void display(int q[][4], int row, int col)
{
int i,j;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
printf("Arr[%d][%d] is %d\n",i,j,*(*(q+i)+j));
}
}
输出:
Arr[0][0] is 1
Arr[0][1] is 2
Arr[0][2] is 3
Arr[0][3] is 4
Arr[1][0] is 5
Arr[1][1] is 6
Arr[1][2] is 7
Arr[1][3] is 8
Arr[2][0] is 9
Arr[2][1] is 10
Arr[2][2] is 11
Arr[2][3] is 12