Оглавление статьи
Массив — это структура данных, хранящая набор элементов одного типа в упорядоченном виде. По сути, это последовательность ячеек памяти, к каждой из которых можно обратиться по индексу. Благодаря простой организации массивы остаются основой для многих алгоритмов и коллекций.
Ключевые свойства
- Фиксированный или изменяемый размер в зависимости от реализации.
- Прямой доступ по индексу: чтение и запись за константное время в большинстве реализаций.
- Память обычно выделяется подряд, что улучшает локальность доступа и производительность.
Типы массивов и их варианты
Статический массив — размер задается при создании (пример: массив в C). Динамический массив может расширяться, автоматически увеличивая буфер по мере добавления элементов (пример: std::vector в C++, ArrayList в Java, list в Python в роли динамического массива). Есть также ассоциативные массивы, которые по сути являются словарями, но это уже другая категория.
Примеры кода
Ниже — компактные образцы, показывающие объявление и операции в трёх популярных языках.
C (статический и динамический)
// статический
int a[5];
a[0] = 10;
// динамический
int *b = malloc(10 * sizeof(int));
b[2] = 5;
free(b);
JavaScript (динамический)
let a = [1, 2, 3];
a.push(4); // добавление в конец
let x = a[1]; // доступ по индексу
Python (список как динамический массив)
a = [1, 2, 3]
a.append(4)
x = a[1]
b = a[:] # копия списка
Операции и их сложность
- Доступ по индексу: O(1).
- Поиск без сортировки: O(n).
- Вставка или удаление в середине: O(n) — требует сдвига элементов.
- Добавление в конец у динамического массива: амортизированно O(1).
Многомерные массивы
Двумерный массив — просто массив массивов или блок памяти с вычислением смещения. Важный момент: порядок хранения строк и столбцов влияет на производительность. В C используется строко-ориентированный (row-major) порядок, а в некоторых языках или библиотеках — столбцовый (column-major).
Копирование, ссылки и срезы
При передаче массива в функцию часто передаётся ссылка на данные, а не копия. В Python срез списка создаёт новую коллекцию, но в NumPy срез — это view, указывающий на те же данные. Неправильное понимание копирования ведёт к багам, особенно при изменении вложенных структур.
Распространённые ошибки и как их избегать
- Выход за границы. Всегда проверяйте индексы или пользуйтесь безопасными методами доступа.
- Ошибочное предположение о копировании. Чётко различайте копию и ссылку.
- Неподходящий тип данных. Выбирайте примитивы или объекты в зависимости от требований памяти и скорости.
Практические советы
- Если размер известен заранее, выделите его один раз. Это экономит перераспределения.
- Для частых вставок и удалений в середине рассмотрите другие структуры: двусвязный список или дек.
- Используйте встроенные методы и библиотеки — они оптимизированы и проверены.
- Для больших чисел элементов учитывайте кеш-подобие: последовательный доступ быстрее случайного.
Короткое резюме
Массив — простой и быстрый инструмент для хранения упорядоченных данных. Знание его свойств и ограничений помогает выбирать правильную структуру для задачи и писать более эффективный код.







