Массивы. Синтаксис объявления.
Рассмотрим новые формы Бэкуса-Наура, которые дополняют уже
известные понятия описателя и инициализатора.
Объявление : : =
/Список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 транслятор
воспринимает его как ошибку.
Содержание