Страница 70 из 82 Многомерный массив Многомерные массивы в 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++ нет принципиальной разницы между массивом массивов произвольной размерности и обычным одномерным массивом. Потому и простор для творчества в деле инициализации многомерных массивов ограничивается левым индексом. |