如何将void *转换为int [] [3]

时间:2019-05-09 07:12:25

标签: c casting

我需要将类型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);
}

2 个答案:

答案 0 :(得分:8)

使用:

int (*i)[3] = param;

然后像以前一样使用它。这是指向整数数组的指针。

答案 1 :(得分:3)

详细答案:

  • imain()的类型为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语言中是不可能做到的。