Что такое массивы

на простых и понятных примерах

Массив в программировании — это структура данных, где хранится упорядоченный набор однотипных элементов. Его можно представить в виде шкафчиков хранения в магазине: это набор ячеек, в которых может что-то лежать.

Шкафчики хранения
Рис.1. Как можно представить массив в программировании

Как и у шкафчиков, каждый элемент массива пронумерован, номер — это его индекс. Но счёт начинается не с единицы, а с нуля.

Схема массива
Рис.2. Схема массива в программировании

Данные в массиве могут быть числами, строками, логическими значениями, объектами. Это зависит от языка. Главное, чтобы все значения были однотипные.

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

Переменные
Рис.3. Переменные для каждого элемента

Эти данные будут разрознены и никак не связаны между собой. А что, если нам бы потребовалось найти самую низкую температуру за целый месяц или даже за весь год?

Гораздо удобнее создать массив «Неделя» и записать данные уже внутри него.

Массив
Рис.4. Массив «Неделя»

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



Как устроены массивы


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

При этом нам нужно обязательно указать его длину (количество элементов) и тип данных, которые будут в нём храниться. В случае массива «Неделя» длина будет равна 7, а тип данных — int (т.е. целые числа). Пример у нас на си-плюсах, но смысл везде будет тот же.

Пример массива
Рис.5. Пример создания массива

Однотипные элементы будут занимать одинаковый объём памяти, в нашем случае — по 4 байта. Компьютер высчитывает количество памяти и резервирует под массив «Неделя» — 28 байт.

Сколько памяти нужно массиву
Рис.6. Сколько памяти компьютера занимает массив

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

 Адрес массива
Рис.7. Адрес массива по индексу

Каждый индекс элемента — тогда смещается на 4 ячейки. А у первого элемента с индексом 0, смещения нет. Вот почему индексы отсчитывают с нуля, а не с единицы.

И это же объясняет, почему нужно заранее указывать тип данных и количество элементов в массиве.

Объявление массива на C++
Рис.8. Как объявить массив на C++

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

Пример кода для поиска элемента в массиве на C++
Рис.9. Как найти элемент в массиве на C++ (первый элемент с индексом 0)

А что будет, если обратиться к ячейке под индексом 9, которая лежит за пределами массива? Будет ошибка!

Ошибка при обращении к элементу массива
Рис.10. Ошибка обращения к элементу в массиве


Для чего нужны массивы


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

Пример кода для нахождения максимального значения в массиве на C++
Рис.11. Как найти максимальный по значению элемент в массиве на C++

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



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


Если одномерный массив, условно, это один ряд элементов, то двумерный массив имеет 2 ряда. Это как таблица, в которой есть строки и столбцы.

Как представить многомерный массив схематически
Рис.12. Схема многомерного массива

Индекс элемента такого массива состоит из двух чисел: номера ряда (строки) и номера элемента в этом ряду, отсчитывая с нуля.

Пример кода поиска элемента в многомерном массиве на C++
Рис.13. Пример обращения к элементу в многомерном массиве на C++

Также бывают массивы трёхмерные, их используют для отрисовки 3D-графики, есть и четырёхмерные, пятимерные и т.д. Но их используют только в особых случаях.



Бывают ли неоднотипные массивы?


Кстати, по поводу того, что все элементы массива должны быть одного типа. Это так, но всё-таки есть массивы, где соседствуют элементы разного типа, скажем, это могут быть числа и строки.

Но тут есть небольшой фокус: все элементы такого массива хранят не сами данные, а ссылки на их расположение в памяти компьютера. И по факту, такой массив состоит из однотипных элементов — ссылок.



Динамические массивы


В самом начале я упоминал, что массив — это структура данных. Так вот, это — одна из самых простых и часто используемых структур данных. А ещё массивы лежат в основе и других структур: это списки, стеки, очереди.


Основные структуры данных:


  • Массив (Array)
  • Динамический массив (Dynamic Array)
  • Множество (Set)
  • Связанный список (Linked List)
  • Стек (Stack)
  • Очередь (Queue)
  • Дек (Double Ended Queue)
  • Карта (Map)
  • Граф (Graph)
  • Двоичное дерево поиска (Binary Search Tree, BST)
  • Префиксное дерево (Trie)

Нас же интересуют динамические массивы. В обычных массивах размер памяти задан заранее и их изменить нельзя. А в динамических — размер может изменяться, и в них можно добавлять новые элементы. Их используют для хранения неопределённого количества элементов.

К языкам, где можно динамически управлять размером массива, относятся JavaScript, в C++ — это векторы (Vectors), в Java — это ArrayList, и очень интересная реализация у списков в Python (Lists).

Программируем / с нуля

Популярное

Полезное

Получить книгу

Мы здесь

Поделиться материалом с друзьями:

Вверх