Существует два варианта двумерного массива в C, хотя синтаксис для доступа к любому из них до смешного похож. Один из вариантов состоит в том, чтобы иметь непрерывный диапазон памяти, содержащий все значения массива, с помощью компилятора, «складывающего» память в кажущуюся многомерную форму для вас:
int contiguous2DArray[3][4] = { 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11 };
int another2DArray[4][3] = { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
int a3DArray[2][2][3] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
/* A series of true statements. */
contiguous2DArray[0][0] == 0;
contiguous2DArray[0][1] == 1;
contiguous2DArray[1][0] == 4;
another2DArray[0][0] == 12;
another2DArray[0][1] == 13;
another2DArray[1][0] == 15;
a3DArray[0][0][0] == 0;
a3DArray[0][0][1] == 1;
a3DArray[0][1][0] == 3;
a3DArray[1][0][0] == 6;
Все, кроме самого последнего размера массива, являются обязательной частью типа. Поскольку эти размеры известны во время компиляции, компилятор знает, что нужно пропускать необходимое количество при увеличении индексов. Последний индекс всегда заставляет компилятор пропускать один пробел каждый раз, когда он увеличивается на единицу. Второй, последний пропустит n
, где n - последний размер, третий к последнему пропустит m * n
, где m и n - два последних размера.
Как вы можете видеть, поскольку размеры не могут изменяться во время выполнения, этот тип массива не подходит для одного, все измерения могут изменяться во время выполнения.
Для подобных массивов вам нужно начать использовать массивы указателей на массивы вместо многомерных массивов непрерывной памяти.