Массивы могут быть следующих видов:
1. Локальные. Располагаются в стеке. Например,
main(){
int A[10];
//…..
}
2. Статические. Располагаются в области данных, глобальных и статических переменных. Например,
main(){
static int A[10];
//…..
}
3. Глобальные. Располагаются в области данных, глобальных и статических переменных. Например,
int A[10];
main(){
//…..
}
4. Дальние глобальные. Располагаются в дальней области глобальных переменных. Например,
far int A[10];
main(){
//…..
}
Двумерные массивы располагаются в памяти по строкам. Начальную строку массива называют нулевой строкой.
В общем случае, многомерные массивы располагаются в памяти так, что при последовательном просмотре его элементов последние индексы меняются быстрее.
Например, трехмерный массив int A[3][4][5] располагается в памяти слоями A[0][…][…], …, A[2][…][…].
Каждый слой, как двумерный массив, располагается по строкам. Например, A[0][0][…], …, A[0][3][…].
Массивы могут размещаться только в пределах одного сегмента, то есть общий размер массива в байтах не превышает 64К.
Обращение к элементу массива
Элементы массива могут стоять в обеих частях операции присваивания, то есть являются объектами Lvalue.
Задание элемента k-мерного массива реализуется последовательным применением операций индексации:
x[i1][i2]...[ik],
где ij - целое выражение, при этом 0<=ij<=nj -1, где nj-1 - максимальное значение j-го индекса массива. Например:
page[5]
line[i+j-1]
big[i][j]
Язык Си не проверяет выход индекса массива за диапазон. Обращение к несуществующему элементу массива является не синтаксической, а “хорошо скрытой” логической ошибкой. Она может привести к непредсказуемым результатам.
Операция индексации является левоассоциативной операцией, то есть выполняется в выражении слева направо. Поэтому при обращении к элементу массива вначале выполняется левая операция индексации []. К полученному результату применяется вторая операция индексации [] и т.д.
Инициализация массивов
Инициализация массивов может быть полной и частичной.