Урок №78. Многомерные массивы

  Юрий  | 

  Обновл. 4 мая 2019  | 

 22083

 ǀ   3 

Элементы массива могут быть любого типа данных, даже массива!

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

Массив массивов называется многомерным массивом:

Поскольку у нас есть 2 индекса, то это двумерный массив.

В двумерном массиве первый (левый) индекс принято читать как количество строк, а второй (правый) как количество столбцов. Массив выше можно представить следующим образом:

[0][0]  [0][1]  [0][2]  [0][3]  // строка №0
[1][0]  [1][1]  [1][2]  [1][3]  // строка №1

Чтобы получить доступ к элементам двумерного массива — просто используйте два индекса:

Инициализация двумерных массивов


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

Хотя некоторые компиляторы могут позволить вам упустить внутренние фигурные скобки, всё же рекомендуется указывать их в любом случае: улучшается читабельность + из-за того, что C++ заменяет отсутствующие инициализаторы значением 0:

В двумерном массиве со списком инициализаторов можно не указывать только левый индекс (длину массива):

Компилятор может сам вычислить количество строк в массиве. Однако не указывать два индекса — это уже ошибка:

Подобно обычным массивам, многомерные массивы можно инициализировать значением 0 следующим образом:

Обратите внимание, это работает только в том случае, если вы явно объявляете длину массива (указываете левый индекс)! В противном случае, вы получите двумерный массив с 1 строкой.

Доступ к элементам в двумерном массиве

Для доступа ко всем элементам двумерного массива требуется два цикла: один для строк и один для столбцов. Поскольку доступ к двумерным массивам обычно выполняется по строкам, то левый индекс используется в качестве внешнего цикла:

Многомерные массивы больше двух измерений


Многомерные массивы могут быть больше двух измерений. Например, объявление трёхмерного массива:

Трёхмерные массивы трудно инициализировать любым интуитивным способом с использованием списка инициализаторов, поэтому лучше инициализировать весь массив значением 0 и явно присваивать значения с помощью вложенных циклов.

Доступ к элементам трёхмерного массива осуществляется так же, как и к элементам двумерного массива:

Пример двумерного массива

Рассмотрим пример использования двумерного массива:

Эта программа вычисляет и выводит таблицу умножения от 1 до 9 (включительно). Обратите внимание, при выводе таблицы в цикле for мы начинаем с 1 вместо 0. Это делается с целью предотвращения вывода нулевой строки с нулевыми столбцами, дабы в результате у нас не было строки с одними нулями!

Результат выполнения программы выше:

1   2    3    4    5    6    7    8    9
2   4    6    8    10   12   14   16   18
3   6    9    12   15   18   21   24   27
4   8    12   16   20   24   28   32   36
5   10   15   20   25   30   35   40   45
6   12   18   24   30   36   42   48   54
7   14   21   28   35   42   49   56   63
8   16   24   32   40   48   56   64   72
9   18   27   36   45   54   63   72   81

Двумерные массивы обычно используются в играх типа tile-based, где каждый элемент массива представляет собой один фрагмент/плитку. Они также используются в компьютерной 3D графике (в виде матриц) для вращения, масштабирования и отражения фигур.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (127 оценок, среднее: 4,84 из 5)
Загрузка...

Комментариев: 3

  1. Аватар Константин:

    Здорового времени суток, Юр! Процитирую тебя:
    "Трёхмерные массивы трудно инициализировать любым интуитивным способом с использованием списка инициализаторов, поэтому лучше инициализировать весь массив значением 0 и явно присваивать значения с помощью вложенных циклов."
    Кинь, пожал-ста, примерчик каким обрезом явно присваивать значения с помощью вложенных циклов, а я вот свою ответку на первую половину мэсседжа шлю:

  2. Аватар Алексей:

    Добрый день, Юрий.
    Прочитав комментарий к этому уроку и информацию на других сайтах я понял, что если надо получить многомерный массив int array[ ][5] заполненный нулями, то можно инициализировать все элементы массива следующим образом.

    Насколько это корректно?
    Можно ли использовать цикл

    Или этот цикл будет лишними строчками кода?

  3. Аватар Александр:

    инициализировать массивы через = {0}; довольно плохая идея. Так возникает иллюзия (особенно у совсем начинающих), что число в скобках задает значение для ВСЕХ элементов массива. Лучше вообще не указывать ничего в скобках и писать = {};
    А еще лучше подчеркивать уровень массива и писать = {{}}; для двумерных.

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

    Как по мне, лучше пользоваться одномерными массивами вместо двумерных везде, где это возможно (и быстрее, и проще, и меньше ошибок)

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *