下面是我的代码,我将数组a传递给一个显示函数,该函数将显示数组。
我得到一个invalid type argument of type unary *
错误在这个语句printf("Arr[%d][%d] is %dn",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 %dn",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 %dn",i,j,*(*(q+i)+j));
}
}
解决这个问题的另一种方法是显式传递数组的地址并取消引用(display()
),但是也可以实现所需的结果,而无需额外的间接级别(display1()
):
#include <stdio.h>
void display(const size_t row, const size_t col, int (*pa)[row][col]);
void display1(const size_t row, const size_t col, int a[row][col]);
int main(void)
{
int a[3][4] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
display(3, 4, &a);
display1(3, 4, a);
return 0;
}
void display(const size_t rows, const size_t cols, const int (*pa)[row][col]);
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t j = 0; j < cols; ++j)
{
printf("Arr[%zu][%zu] is %dn", i, j, (*pa)[i][j]);
}
}
}
void display1(const size_t rows, const size_t cols, const int a[row][col]);
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t j = 0; j < cols; ++j)
{
printf("Arr[%zu][%zu] is %dn", i, j, a[i][j]);
}
}
}
Update:这至少需要一个C99兼容的编译器
在现代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 %dn", i, j, q[i][j]);
}
}
一般来说,要将2D
数组传递给函数,您需要指定除第一个维度之外的所有数组的维度,因此在本例中,您需要将[4]
用于最后一个维度,但您可以选择省略它用于第一个维度,即
void display( int (*q)[4], int row, int col)
并作如下声明
void display(int (*)[], int, int);
你唯一的问题是你调用display的方式。您需要在传递数组时删除索引,并修复display的初始定义以匹配:
#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 %dn",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