- Массивы
- Работа
Массивы
Массив – это последовательно хранимый набор нескольких «пронумерованных» переменных одинакового типа, называемых
элементами массива.
Для определения массива используется следующий шаблон:
<тип> <идентификатор>[<размер>];
Здесь тип – как и ранее, любой из определенных типов, обозначающий тип каждого элемента массива, идентификатор – это собственно имя переменной-массива, а размер (который может и отсутствовать) – это константа, ограничивающая количество элементов массива.
Обратите внимание на то, что квадратные скобки должны присутствовать всегда, независимо от того, задается ли размер или нет – это признак массива.
Из определения массива следует, что, во-первых, все элементы массива находятся в памяти друг за другом, а во-вторых, имеют одинаковый тип. Чем же это отличается от обычного последовательного определения нескольких однотипных переменных?
int a[5]; // массив а[] из 5-и элементов типа int
int a1, a2, a3, a4, a5; // 5 отдельных переменных типа int
Отличие принципиальное. Определенные во второй строке переменные независимы друг от друга, для обращения к каждой из них программист обязан использовать уникальный идентификатор. У массива же идентификатор единственный, а для обращения к его элементам используется индекс, т.е. номер элемента: a[0] – первый элемент массива, a[4] – пятый элемент. Обратите внимание, что нумерация элементов массива начинается с нуля. Преимущество массивов перед отдельными переменными бросается в глаза на простом примере. Если представить себе строку символов в виде массива и в виде нескольких отдельных символьных переменных, сразу становится ясно, что работа со строкой уже из десятка символов становится неразумно сложной, в то время как каждый их элементов массива-строки может быть обработан одним и тем же способом.
В качестве указателя размера массива при описании может использоваться любая целочисленная константа, а при обращении – константа или переменная соответствующего типа. В Си никак не контролируется допустимость индекса при обращении к элементу массива, т.е. обращение к a[12] будет воспринято компилятором, как безошибочное, однако результат в этом случае не предсказуем.
Рассмотренный пример массива – одномерный, т.е. его можно представить в виде «линейки» с делениями – элементами. Однако нередко требуется оперировать массивами-«плоскостями», «кубами» и более многомерными (1) «фигурами». Такая возможность предусмотрена в Си: многомерный массив описывается так же, как и одномерный, только количество квадратных скобок (с возможно указанным размером «измерения») соответствует числу измерений:
int al[5]; // 1-мерный массив из элементов int
int a2[] []; // 2-мерный массив элементов int
// c неопределенными размерами
int a3[3][3][3]; // 3-мерный массив элементов int
// c определенными размерами
Подобные записи «читаются» слева направо, например, третья строка примера читается так: массив из трех элементов, каждый из которых представляет собой массив из трех элементов, элементами которого являются массивы из трех элементов типа int. «Трехмерный массив» звучит куда проще, но это неудобное описание помогает понять, как именно следует обращаться к многомерному массиву:
а3[0] - это массив двумерный
а3[0][0] - это массив одномерный
а3[0][0][0]- это элемент массива (не массив!) типа int
Кстати, фактически многомерные массивы – это лишь форма сокращенной (и, возможно, более удобной) записи одномерного массива, размер которого определяется произведением размеров по его «измерениям». Т.е. рассмотренный массив a3 можно представить в виде одномерного массива с размером 27 элементов. Именно как одномерный и хранится в памяти многомерный массив, причем «развертка измерений» происходит по измерениям справа налево, т.е. самым первым в памяти будет элемент a3[0][0][0], затем a3[0][0][1], затем a3[0][0][2], затем a3[0][1][0] и т.д.
Как и любые переменные, массивы в момент описания инициализируются значением по умолчанию. Кроме того, как и для любой переменной, для объявления массива возможно использование ключевых слов extern, static и volatile.
- Вспоминается шутка математиков: «представьте себе проекцию семимерного куба на пятимерную плоскость»…