Массивы. Синтаксис объявления.

Рассмотрим новые формы Бэкуса-Наура, которые дополняют уже известные понятия описателя и инициализатора. Объявление : : = /СписокCпецификаторовОбъявления/ /СписокОписателей/; Описатель : : = Описатель /Инициализатор/ Описатель : : = Описатель [ /КоyстантноеВыражение/ ] : : = ***** Инициализатор : : = = { СписокИнициализаторов [,]} СписокИнициализаторов : : = Выражение : : = СписокИнициализаторов, Выражение : : = { СписокИиициалиэаторов [,]} Теперь мы располагаем набором синтаксических средств для объявления массивов. Массивы не являются основными (встроенными) типами. Они специально объявляются в программе и поэтому могут рассматриваться как производные. Объект типа "массив элементов объявленного типа" представляет последова- тельность объектов этого самого типа, объединённых одним общим именем. Количество элементов массива является характеристикой конкретного массива, но не самого типа. Приведём примеры объявления и определения массивов. extеrn int intArray_1 [ ] ; Объявлен (именно объявлен - об этом говорит спецификатор extern) массив типа int, имя массива - intArray_1, разделители [ ] указывают на то, что перед нами объявление массива. int intArray_2 [10] ; А это уже определение массива. Всё тот же тип int, имя массива - intArray, между разделителями [ и ] находится константное выражение, значение которого определяет размеры массива. Требование синтаксиса по поводу константного выражения между разделителями в определении массива может быть объяснено лишь тем, что информация о количестве элементов массива требуется до момента начала выполнения программы. Int intArray_3 [ ] = {1,2,3} ; // Это также определение массива. Информация о количестве элементов массива заключается непосредственно в инициализаторе. Элементам массива присваиваются соответствующие значения из списка инициализаторов. Ещё одна форма определения массива: int IntArray_4 [3] = {1,2,3}; В этом определении массива важно, чтобы количество элементов в инициализа- торе массива не превышало значение константного выражения в описателе массива. В результате выполнения этого оператора в памяти выделяется область, достаточная для размещения трёх объектов-представителей типа int. Участку присваивается имя intArray_4. Элементы инициализируются значениями, входящими в состав инициализатора. Возможна частичная инициализация массива. При этом начальные значения получают первые элементы массива: int intArray_5 [3] = {1,2} ; В этом определении массива означены лишь первые два элемента массива. Значение последнего элемента массива в данном случае не определено. Здесь нужно отметить одну особенность синтаксиса инициализатора массива. Речь идёт о необязательной запятой в конце списка инициализаторов. По-видимому, её назначение заключается в том, чтобы указывать на факт частичной инициализации массива. Действительно, последний вариант (частично) инициализирующего оператора определения массива выглядит нагляднее: Int intArray_5 [3] = {1,2, } ; Последняя запятая предупреждает о факте частичной инициализации массива. Затраты на связывание запятой в конце списка инициализаторов со строго определённым контекстом частичной инициализации оказываются столь значительными, что последняя запятая традиционно считается всего лишь необязательным элементом любой (в том числе и полной) инициализации. int intArray_6 [3] = {1,2,3} ; int intArray_6 [3] = {1,2,3,} ; // Полная инициализация с запятой… int intArray_6 [ ] = {1,2,3} ; int intArray_6 [ ] = {1,2,3,} ; Между этими операторами нет никакой разницы. А вот в таком контексте int intArray_6 [3] = {1,2, } ; // Частичная инициализация массива из трёх элементов... Последняя запятая в фигурных скобках - не более как полезное украшение. Что-то недосказанное таится в таком операторе присвоения... int intArray_7 [ ] ; А вот это некорректное объявление. Без спецификатора extern транслятор воспринимает его как ошибку.

Содержание