我需要将类型int[][3]
的变量传递给仅接受void*
作为参数的回调函数。我该怎么办?
以下代码无法编译:
void myfunc(void *param) {
int i[][3];
i=*param;
printf("%d\n",i[1][2]);
}
int main(int argc, char *argv[])
{
int i[][3]={
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
myfunc(i);
}
答案 0 :(得分:8)
使用:
int (*i)[3] = param;
然后像以前一样使用它。这是指向整数数组的指针。
答案 1 :(得分:3)
详细答案:
i
中main()
的类型为int[3][3]
,是一个数组数组。int[3][3]
的第一个元素的类型为int[3]
。int(*)[3]
的数组指针,因此,当您键入i
时,myfunc(i)
就会结束。int(*)[3]
是在函数内部使用的正确类型。int (*i)[3];
,则访问i[x]
将为您提供数组数组中的数组编号x
。i[x][y]
将为您提供数组编号x
,项目编号y
。因此语法的最终效果与直接访问2D数组时的语法完全相同。类似地,您可以将函数编写为void myfunc(int param[3][3])
。参数将隐式衰减为“ {在行之间”的指针int(*)[3]
,使您可以在函数内部使用param[x][y]
。看起来好像数组是按值传递的,但事实并非如此-在C语言中是不可能做到的。