Рассмотрим новые формы Бэкуса-Наура, которые дополняют уже известные понятия описателя и инициализатора.
Объявление ::= [СписокСпецификаторовОбъявления] [СписокОписателей]; Описатель ::= Описатель [Инициализатор] Описатель ::= Описатель[[КонстантноеВыражение]] ::= ***** Инициализатор ::= = {СписокИнициализаторов [,]} СписокИнициализаторов ::= Выражение
::= СписокИнициализаторов, Выражение
::= {СписокИнициализаторов [,]}
Теперь мы располагаем набором синтаксических средств для объявления массивов. Массивы представляют собой производные типы (указатели также относятся к производным типам).
Объект типа "массив элементов заданного типа" представляет последовательность объектов этого самого типа, объединённых одним общим именем. Количество элементов массива является важной характеристикой самого массива, но не самого типа. Эта характеристика называется размерностью массива.
Приведём примеры объявления и определения массивов. extern 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};