C++. Бархатный путь. Часть 1
Страница 70. Многомерный массив


 

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

Многомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы.

Определение многомерного массива должно содержать информацию о типе, размерности и количестве элементов каждой размерности.

int MyArray1[10]; // Одномерный массив размерности 10.
int MyArray2[20][10]; // 20 одномерных массивов размерности 10.
int MyArray3[30][20][10]; // 30 двумерных массивов размерности 20*10.

По крайней мере, для Borland C++ 4.5, элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса, т.е. самый младший адрес имеют элементы

MyArray1[0],
MyArray2[0][0],
MyArray3[0][0][0],

затем элементы

MyArray1[1],
MyArray2[0][1],
MyArray3[0][0][1]

и т.д.

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

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

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

MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[0][0][2] == 2
MyArray[0][1][0] == 3
MyArray[0][1][1] == 4
MyArray[0][1][2] == 5
MyArray[0][2][0] == 6
MyArray[0][2][1] == 7
MyArray[0][2][2] == 8
MyArray[1][0][0] == 9
MyArray[1][0][1] == 10
MyArray[1][0][2] == 11

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

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

int MyArray[3][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100},{3000,3100,3200}}
};

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

MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[1][0][0] == 100
MyArray[1][1][0] == 200
MyArray[1][1][1] == 210
MyArray[1][2][0] == 300
MyArray[2][0][0] == 1000
MyArray[2][1][0] == 2000
MyArray[2][1][1] == 2100
MyArray[2][2][0] == 3000
MyArray[2][2][1] == 3100
MyArray[2][2][2] == 3200

По аналогии с одномерным массивом, при явной инициализации массива входящего в состав многомерного массива его самая левая размерность может не указываться. Она определяется на основе инициализатора.

int MyArray[ ][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100}}
};

Транслятор понимает, что речь идёт об определении массива размерности 3*3*3.

А в таком случае

int MyArray[ ][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100}},
{{10000}}
};

предполагается размерность 4*3*3. В результате MyArray оказывается массивом из четырёх частично проинициализированных двумерных массивов. Следует помнить, что в C++ нет принципиальной разницы между массивом массивов произвольной размерности и обычным одномерным массивом. Потому и простор для творчества в деле инициализации многомерных массивов ограничивается левым индексом.

 

 
« Предыдущая статья   Следующая статья »