Свойства массива как структуры

Массив – это, в первую очередь, структура данных. Её обычно разделяют на два вида, поэтому мы можем встретить такие определения как:

  1. Статический массив – имеет фиксированное количество элементов и не может расширяться или сужаться.
  2. Динамический массив – имеет динамический объём, т.е. может расширяться и сужаться в процессе выполнения.

Второе определение я считаю ошибочным, так как массив, по определению, это и есть статическая структура данных. В C# есть реализация статического массива, с помощью типа List<T>, но внутри него обыкновенный статический массив и расширение листа происходит за счёт создания нового массива и переноса в него старого. Для того, чтобы это происходило быстро, внутри происходит так называемая амортизация. Суть амортизации, в данном случае, заключается в том, что расширение происходит не на один элемент, а на текущее количество элементов в старом массиве, умноженное на два.

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

Когда мы создаем массив, мы указываем тип его элементов. Условно каждый элемент определенного типа имеет размер S. В случае с ссылочными типами – мы храним только ссылки на объекты в памяти. Во время создания массива в памяти компьютера выделяется количество памяти S * N + M. Где N – количество элементов, а M – метаинформация самого массива.  

В итоге мы получим что-то типа этого:

Значение10415
Индекс012
Адрес001000180026
Размер элемента – 8Начало массива по адресу – 0010Длина – 3

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

Поиск элемента в массиве происходит очень быстро. Чтобы получить адрес в памяти значения под индексом 1 – нам нужно умножить этот индекс на размер элемента и прибавить результат к адресу начала массива. В итоге у нас получится адрес элемента в памяти.

1 * 8  + 0010 = 0018

Именно поэтому у массива достаточно дешевая операция чтения по индексу.

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

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

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *