На этом шаге мы поговорим более подробно о многомерных массивах.
Многомерный массив представляет собой массив массивов, то есть массив, элементами которого служат массивы. Определение многомерного массива в общем случае должно содержать сведения о типе, размерности и количествах элементов каждой размерности, например описание: int ARRAY[4][3][6]; определяет массив, состоящий из четырех элементов, каждый из которых - двухмерный массив с размерами 3 на 6. В памяти массив ARRAY размещается в порядке возрастания самого правого индекса, то есть самый младший адрес имеет элемент ARRAY[0][0][0], затем идет элемент ARRAY[0][0][1] и т.д.
С учетом порядка расположения в памяти элементов многомерного массива нужно размещать начальные значения его элементов в списке инициализации. Например, конструкция:
int ARRAY [4][3][6] = {0,1,2,3,4,5,6,7}
ARRAY[0][0][0]=0, ARRAY[0][0][1]=1, ARRAY[0][0][2]=2, ARRAY[0][0][3]=3, ARRAY[0][0][4]=4, ARRAY[0][0][5]=5, ARRAY[0][1][0]=6, ARRAY[0][1][1]=7.
При необходимости инициализировать только часть элементов многомерного массива, но они размещены не в его начале или не подряд, то можно вводить дополнительные фигурные скобки, каждая пара которых выделяет последовательность значений, относящихся к одной размерности. (Нельзя использовать скобки без информации внутри них.)
Следующее определение с инициализацией трехмерного массива:
int А[4][5][6] = { { {0} /*Нулевой элемент.*/ },/*Нулевой массив.*/ { {100},/*Нулевой элемент.*/ {110, 111} /*Первый элемент.*/ }, /*Первый массив.*/ { {200),/*Нулевой элемент.*/ {210},/*Первый элемент.*/ {220, 221, 222}/*Второй элемент.*/ }; /*Второй массив.*/
А[0][0][0]=0, А[1][0][0]=100, A[1][1][0]=110, A[1][1][1]=111, А[2][0][0]=200, A[2][1][0]=210, A[2][2][0]=220, A[2][2][1]=221, A[2][2][2]=222.
Если многомерный массив при определении инициализируется, то его самая левая размерность может в скобках не указываться. Количество элементов компилятор определяет по числу членов в инициализирующем списке. Например, определение:
float matrix [ ][5] = { {1}, {2}, {3} };
Как и в случае одномерных массивов, доступ к элементам многомерных массивов возможен с помощью индексированных переменных и с помощью указателей. Следующая программа иллюстрирует оба подхода к организации доступа к элементам массива.
#include <iostream.h> void main() { int b[3][2][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 100, 101, 102, 103, 104, 105, 106, 107 }; //Адрес массива b[ ][ ][ ]. cout<< "\n b= " << b; // Адрес массива b[0][ ][ ]. cout<< "\n *b= " << *b; // Адрес массива b[0][0][]. cout<< "\n **b= " << **b; // Элемент b[0][0][0]. cout<< "\n ***b= " << ***b; // Адрес массива b[1][ ][ ]. cout<< "\n *(b+1) = " << *(b+1); // Адрес массива b[2][][]. cout<< "\n *(b+2) = " << *(b+2); // Адрес массива b[0][1][ ]. cout<< "\n *(*b+1)= " << *(*b+1); //Вывод элемента b[1][1][1] двумя способами. cout<< "\n *(*(*(b+1)+1)+1)= " << *(*(*(b+1)+1)+1); cout<< "\n b[1][1][1]= " << b[1][1][1]; }
В общем случае для трехмерного массива индексированный элемент b[i][j][k] соответствует выражению *(*(*(b + i) + j) + k).
Компилятор всегда реализует доступ к элементам массива с помощью указателя и операции разыменования. Если в программе использована, например, такая индексированная переменная: AR[i][j][k], принадлежащая массиву type AR[N][М][L], где N, M, L - целые положительные константы, то последовательность действий компилятора такова:
На следующем шаге мы продолжим изучение массивов, в частности, поговорим
о
взаимосвязи массивов и указателей.