Массивы — это последовательность объектов одного типа, занимающих смежные области памяти.
Общие сведения о массивах
Если требуется найти решение задачи, которое связано с обработкой существенных информационных объёмов с однотипными данными и с применением различных не отсортированных переменных, то может возникнуть большое количество разных вопросов, сопряжённых с формированием программы для её решения. Для упрощения программной реализации алгоритмов, необходимых для решения таких проблемных задач, в языках программирования, и в том числе в языке С++, используются специальные объекты, именуемые массивами. Массивом является фиксированный участок памяти, который содержит объекты одного типа и обладает собственным именем. Массив может быть охарактеризован следующим набором параметров:
- Компонент массива – значение, сохраняемое в заданных ячейках памяти, расположенных в границах массива и имеющих конкретные адреса ячеек памяти.
- Адрес массива – адресация первого компонента массива.
- Имя массива – идентификационный признак, предоставляющий возможность обращения к компонентам массива.
- Размер массива – число входящих в состав массива элементов.
- Размер элемента – число байтов, которые отводятся для одного элемента массива.
- Размер массива – число байтов, которые отведены в памяти для сохранения всех компонентов массива. Говоря иначе, под размером массива следует понимать величину произведения размера одного элемента массива на их общее количество.
Каждый элемент, входящий в состав массива, может быть охарактеризован следующим набором параметров:
- Адрес элемента, определяемый как адрес первой ячейки памяти, где располагается этот элемент.
- Индекс элемента, который является его номером в составе массива.
- Размер элемента, который определяется его содержимым.
Двумерные массивы могут считаться аналогами математического понятия матрица. В разных программных языках, включая и С++, двумерным массивом считается массив, который состоит из совокупности одномерных массивов.
Массивы в C++ и работа с ними
Исходя из размерности, массивы в языке программирования С++ подразделяются на следующие типы:
- Одномерные массивы.
- Двумерные массивы.
- Многомерные массивы.
Многомерным массивом является такой массив, который имеет больше одного индекса. Многомерный массив может быть представлен в виде совокупности элементов, которые расположены по разным осям координат. Двумерный массив в графическом формате можно представить в следующем виде:
[][][][][]
[][][][][]
[][][][][]
[][][][][]
[][][][][]
Приведённый выше образец двумерного массива имеет размерность пять на пять, то есть, он обладает пятью строками и пятью столбцами.
Память под массивы может быть выделена в автоматическом или динамическом режиме. Автоматическое предоставление памяти применяется, если размеры массива известны ещё при выполнении компиляции, то есть при формировании кода программы. Динамическое предоставление памяти применяется, если размеры массива неизвестны при реализации компиляции, например, когда программа будет их запрашивать у пользователей.
Оба вида массивов могут выступать как глобальные, то есть определяемые вне функций, так и локальные, то есть, определяемые в самой функции или блоке. В этом случае для автоматических массивов присутствует один нюанс. Память для локального автоматического массива должна выделяться в стеке. По этой причине размеры такого массива обязаны быть небольшими. Иначе может случиться переполнение стека и, следовательно, программа будет завершена аварийно. Переполнение стека также может произойти и при незначительных размерах локальных автоматических массивов, если осуществляется многократный рекурсивный вызов функции.
Глобальные автоматические массивы, в смысле возможности переполнить стек, являются безопасными. Но они будут доступны во всём программном коде, лексикографически расположенном за объявлением массивов, что способно спровоцировать их применение напрямую, минуя процесс их передачи в функции при помощи параметров. Это может привести к появлению побочных эффектов работы функций, что способно затруднить отладку и сделать программы недостаточно надёжными.
Для массивов, применяющих динамическое предоставление памяти, память выделяется из так называемой «кучи» (heap). Кучей является память, которая выделяется программе операционной системой, и предназначена для применения данной программой. Размеры кучи обычно существенно больше размера стека, а для операционных систем, которые поддерживают предоставление виртуальной памяти, размер кучи в теории может быть ограничен лишь разрядностью приложений.
Автоматические массивы применяют, если размеры массива являются известными на этапе компиляции. Размеры массива в программном коде всегда лучше указать при помощи поименованной константы. Это подтверждается следующими соображениями:
- Наименование константы обязано указать на область её использования.
- Если возникает необходимость изменения размера массива в программе, то нужно буде внести исправление лишь в одном месте.
- Размеры массива обычно применяются в циклах прохода по массиву, проверки границы и прочих, поэтому применение символического имени избавляет от необходимости тщательных проверок и правок всего кода при коррекциях размеров массива.
Тип константного выражения для задания размеров, то есть, количества компонентов, автоматического массива обязан быть целочисленным, а именно, char, int, unsigned int, long, etc.
Память, которая отводится под автоматические массивы, должна освобождаться при выходе из области видимости переменной-массива. Для локальных массивов это может быть функция или блок, а глобальные массивы ликвидируются при выходе из программы.