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

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

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

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

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

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

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

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

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

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

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

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

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

Также бывают массивы трёхмерные, их используют для отрисовки 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).