как разыграть void * в int [] [3] - PullRequest
3 голосов
/ 09 мая 2019

Мне нужно передать переменную типа 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 ]

8 голосов
/ 09 мая 2019

Использование:

int (*i)[3] = param;

Затем используйте его, как и раньше.Это указатель на массив целых чисел.

3 голосов
/ 09 мая 2019

Подробный ответ:

  • Тип 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. Таким образом, синтаксис заканчивается так же, как при непосредственном доступе к двумерному массиву.

Точно так же вы могли бы написать функцию как void myfunc(int param[3][3]). Param неявно затухает в указатель int(*)[3] «между строк», что позволяет использовать param[x][y] внутри функции. Выглядит так, будто массив передается по значению, но это не так - делать это невозможно в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...