Step 8 (S-2687)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/543/step/8

Многомерные массивы в C++ можно создавать не только в динамической памяти, но и на стеке. Это делается так же, как и с одномерными массивами:


int a[5][3];cout << a[1][1] << " " << a[1][2] << endl;


Если массив будет проинициализирован сразу при определении, то его внешнюю размерность можно не указывать:

int a[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };


В примере выше будет создан двумерный массив 3 × 3 (три массива по три элемента).

Многомерный массив на стеке можно проинициализировать ещё и следующим, казалось бы, необычным образом:


int a[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };


Дело в том, что многомерные массивы на стеке отличаются от показанных вам на лекции многомерных массивов в динамической памяти — многомерный массив на стеке хранится в непрерывном участке памяти (ему не требуется индексной таблицы с указателями).

Давайте рассмотрим это на примере двумерного массива:


int a[N][M];


В памяти в начале такого массива хранятся M элементов 0-ой строки, затем M элементов 1-ой строки, затем M элементов 2-ой строки и так далее до строки с номером N - 1 включительно. Другими словами, двумерный массив размера N × M представлен в памяти так же, как и одномерный массив размера NM, поэтому второй вариант инициализации массива эквивалентен первому.

Пользуясь этим знанием, мы теперь можем понять, почему две следующие строки эквивалентны.


*((int *)a + i * M + j) = 1;


a[i][j] = 1;