Шаг 37.
Многомерные массивы

    На этом шаге мы поговорим более подробно о многомерных массивах.

    Многомерный массив представляет собой массив массивов, то есть массив, элементами которого служат массивы. Определение многомерного массива в общем случае должно содержать сведения о типе, размерности и количествах элементов каждой размерности, например описание: 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} 
инициализирует только первые 8 элементов этого массива:
    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} }; 
формирует массив matrix с размерами 3 на 5, но не определяет явно начальных значений всех его элементов.

    Как и в случае одномерных массивов, доступ к элементам многомерных массивов возможен с помощью индексированных переменных и с помощью указателей. Следующая программа иллюстрирует оба подхода к организации доступа к элементам массива.

#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 - целые положительные константы, то последовательность действий компилятора такова:



    На следующем шаге мы продолжим изучение массивов, в частности, поговорим о взаимосвязи массивов и указателей.


Предыдущий шаг Содержание Следующий шаг