1.10. Массивы

Описание одномерного массива в языке С имеет вид:

тип имя массива [ длина ] [ = { список значений } ] ;

Здесь тип - тип элемента массива, имя массива - идентификатор, длина -количество элементов массива, заданное константным выражением, список зна­чений - последовательность разделенных запятыми константных выражений, например:

int a[7]={-1,147/3+26/7,33,5,6,0,-11};

Индексы элементов любого массива всегда начинаются с 0, так что послед­ний элемент имеет индекс длина-1. Так, в приведенном примере индекс послед­него (седьмого по счету) элемента массива a равен б. Инициализирующая часть оператора не обязательна; кроме того, длина списка значений может быть мень­ше длины массива, тогда оставшиеся элементы массива не инициализируются. Если задан полный список значений, то можно не указывать длину массива - па­мять под массив будет распределена в соответствии с количеством инициализи­рующих выражений, но модификатор [ ] , означающий массив, опускать нельзя.

Имя массива считается константой-указателем, равной адресу нулевого эле­мента массива, т.е. a и &a[0] - это одно и то же. Обращение к элементам массива возможно либо с помощью индексов (точно так же, как в языке PASCAL) : a[i] , либо по адресу : *(a+i) - причем в последнем случае используется адресная арифметика. Фактически в программе всегда происходит обращение к элементу массива по адресу, а использование индексов допускается лишь для удобства программирования. Выход индекса за границы массива никак не отслеживается в языке С и не считается ошибкой.

Описание многомерного массива в общем случае имеет вид:

тип имя массива [ длина} ] [ длина2 ] ... [ ={ список значений } J ; Например, двумерный массив b можно описать в виде

int b[3][4]={{1,2,3,4},{3,7,0,2},{3,7,4,8}}; Массив b является массивом из трех элементов, каждый из которых есть массив из четырех элементов типа int, это обстоятельство явным образом отражено в инициализирующей части оператора. Но если инициализируются все элементы массива, как в приведенном примере, внутренние {} можно опускать:

int b[3][4]={1,2,3,4,3,7,0,2,3,7,4,8};

Внутренние {} необходимы, если часть элементов не инициализируются:

int b[3][4]={{1,2},{4,3,7},{0}};

Здесь инициализированы элементы b00,b01,b10,b11,b12,b20. В случае, если задан полный список значений, можно опускать первую из длин измерений, она будет неявно определена как длина списка значений, последовательно поделенная на явно указанные длины измерений. Так, массив b можно описать как

int b[][4]={1,2,3,4,3,7,0,2,3,7,4,8}; Имя многомерного массива также является константой - указателем на самый первый элемент массива (т.е. элемент, все индексы которого - нули). Элементы многомерного массива - массивы - являются указателями на соответствующие подмножества элементов. Обращение к элементам многомерных массивов воз­можно с помощью индексов: b[i][j] или по адресу: *(b[i]+j) . Каждый индекс элемента многомерного массива должен быть обязательно заключен в собствен­ные [ ] . Запись вида b[i,j] не является ошибкой (вспомним об операции "запя­тая"), но она определяет не элемент массива - число типа int, а адрес подмноже­ства элементов, начинающегося с элемента bj0 .