6.4  Многомерные массивы

Многомерные массивы в языке C++ рассматриваются как массивы, элементами которых являются массивы. Они создаются путем объявления массивов из элементов типа массив. Например, двумерный массив из пяти строк и семи столбцов с именем alpha объявляется следующим образом:

type alpha [5] [7];

Элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса, т.е. самый младший адрес имеют элементы:

alpha [0] [0], alpha [0] [1], alpha [0] [3] и т.д.

Многомерный массив подобно одномерному массиву может быть проинициализирован с помощью списка инициализаторов. Первыми инициализируются элементы с самыми маленькими индексами. Например:

int array[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11};

Начальные значения получают следующие элементы трёхмерного массива:

array[0][0][0] == 0

array[0][0][1] == 1

array[0][0][2] == 2

array[0][1][0] == 3

array[0][1][1] == 4 и т.д.

Если число инициализаторов меньше, чем элементов массива, то остальные элементы получают начальные значения в соответствии со статусом массива (в глобальном массиве значения остальных элементов равны 0, в локальном массиве элементы имеют неопределённые значения). 

Для выборочной инициализации используются дополнительные фигурные скобки, позволяющие инициализировать отдельные фрагменты многомерного массива. Каждая пара фигурных скобок специфицирует значения, относящиеся к одной определённой размерности. Пустые фигурные скобки не допускаются (и это означает, что в языке C++ реализован жёсткий алгоритм инициализации массивов). Например:

int array[3][3][3] = {

{{0,1}},

{{10},{20,21},{30}},

{{100},{200,210},{300,310,320}}

};

В результате выполнения этого предложения будут означены следующие элементы массива array:

array[0][0][0] == 0

array[0][0][1] == 1

array[1][0][0] == 10

array[1][1][0] == 20

array[1][1][1] == 21

array[1][2][0] == 30

array[2][0][0] == 100

array[2][1][0] == 200

array[2][1][1] == 210

array[2][2][0] == 300

array[2][2][1] == 310

array[2][2][2] == 320

В определенном контексте первое <константное выражение> многомерного массива может не иметь выражения в квадратных скобках. Такой массив имеет неопределенный размер. Контекстом, где допустимо такое положение, является тот случай, когда для резервирования памяти размер массива не требуется. Например, для объявления extern объекта типа массив точный размер массива не требуется; не требуется он и при передаче функции параметра типа массива.

В отличие от языка  C язык C++ допускает массив неопределенных размеров, которым должен быть последний член структуры. Такой массив не увеличивает размера структуры, за исключением того, что для обеспечения правильного выравнивания структуры на границу слова он может быть дополнен символами-заполнителями. Такие структуры  обычно используются при динамическом распределении памяти, когда для правильного резервирования области памяти к размеру структуры следует явно добавить необходимое число символов-заполнителей.

Агрегаты данных типа классы будут рассмотрены во второй части пособия.