- (и 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;
Другие ответы показывают, как распределить память в этом случае, но, хотя она широко используется, это не всегда лучшее решение.См. Например:
Правильное размещение многомерных массивов