Двухмерные массивы и представление указателя - PullRequest
0 голосов
/ 06 сентября 2018

Три вопроса в 1.

  1. Если у меня есть двумерный массив -

    int array_name[num_rows][num_columns] 
    

    Таким образом, он состоит из массивов num_rows, каждый из которых является массивом размера = num_columns. Его эквивалентное представление с использованием массива указателей -

    int* array_name[num_rows] 
    

    - так что индекс, заданный [num_rows], по-прежнему показывает количество одномерных массивов - где-то, используя malloc, мы можем затем указать размер каждого из одномерных массивов как num_columns. Это правильно? Я видел некоторые тексты, говорящие

    int* array_name[num_columns] 
    

    не переключатся ли индексы в этом случае?

  2. Для массива идентификаторов я определяю размер динамически как-

    int *p;
    p = (int*) malloc (size * sizeof(int))
    

    Для двумерных массивов указывать размер всего двумерного массива или одного одномерного массива в malloc -

    int*p [row_count];
    p = (int*) malloc (row_count * column_count * sizeof(int))
    

    или

    p = (int*) malloc (column_count * sizeof(int))
    

    Я думаю, что это должно быть второе, поскольку p - это указатель на одномерный массив, а p + 1 - это указатель на одномерный массив и т. Д. Пожалуйста, уточните.

  3. Для квеста 2 - что, если p был определен как - int **p; вместо int * p[row_count] Как тогда будет использоваться malloc? Я думаю, что это должно быть -

    p = (int*) malloc (row_count * column_count * sizeof(int))
    

Пожалуйста, исправьте, подтвердите, улучшите.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018
  1. (и 2.)

    Если у меня есть двумерный массив

    int array_name[num_rows][num_columns];

    Таким образом, он состоит из массивов num_rows, каждый из которыхявляется массивом размера = num_columns.

Если во время компиляции известны и num_rows, и num_columns, эта строка объявляет массив num_rows массивов num_columns int s, что, да, обычно называется 2D-массивом int.

Начиная с C99 (и, возможно, в C11) вы можете использовать две переменные, неизвестные во время компиляции, и в конечном итоге объявитьвместо него - массив переменной длины.

Его эквивалентное представление с использованием массива указателей:

int* array_name[num_rows];

Таким образом, индекс, заданный [num_rows], по-прежнемупоказывает количество одномерных массивов - где-то, используя malloc, мы можем указать размер каждого из одномерных массивов в виде num_columns.Это верно?

Технически, теперь array_name объявлен как массив num_rows указателей на int, а не массивов.Чтобы «завершить» «двумерный массив», необходимо пройти массив и выделить память для каждой строки.Обратите внимание, что строки могут иметь разные размеры.

Используя эту форму:

int (*array_name)[num_columns];
//  ^           ^ note the parenthesis 
array_name = malloc(num_rows * sizeof *array_name);

Здесь array_name объявляется как указатель на массив из num_columns int с, а затем выделяется нужное количество строк.

3.

что, если p был определен как int **p;

Другие ответы показывают, как распределить память в этом случае, но, хотя она широко используется, это не всегда лучшее решение.См. Например:

Правильное размещение многомерных массивов

0 голосов
/ 06 сентября 2018

Объявление:

int *array_name[num_rows];

или:

int *array_name[num_columns];

это то же самое. Меняется только имя, но ваша переменная по-прежнему ссылается на строки, потому что C является мажорной строкой , поэтому вы должны назвать ее строкой.

Вот как можно выделить двумерный массив:

int (*p)[column] = malloc (sizeof(int[row][column]);

Можно выделить int **, тогда как int [] [] - это временный массив, определенный только в области действия вашей функции.

Не забывайте, что точка с запятой необходима в конце почти каждой строки.
Вы должны прочитать эту страницу для более полного объяснения предмета

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