Общая форма объявления одномерного массива имеет следующий вид:
тип имя_переменной [размер];
Как и другие переменные, массив должен быть объявлен явно, чтобы компилятор выделил для него определенную область памяти (т.е. разместил массив). Здесь тип обозначает базовый тип массива, являющийся типом каждого элемента. Размер задает количество элементов массива. Например, следующий оператор объявляет массив из 100 элементов типа double под именем balance:
double balance[100];
Согласно стандарту С89 размер массива должен быть указан явно с помощью выражения-константы. Таким образом, в программе на С89 размер массива определяется во время компиляции и впоследствии остается неизменным. (В С99 определены массивы, размер которых определяется во время выполнения. О них еще будет идти речь далее в этой главе, а также более подробно в части II).
Доступ к элементу массива осуществляется с помощью имени массива и индекса. Индекс элемента массива помещается в квадратных скобках после имени. Например, оператор
balance[3] = 12.23;
присваивает 3-му элементу массива balance значение 12.23.
Индекс первого элемента любого массива в языке С равен нулю. Поэтому оператор
char p[10];
объявляет массив символов из 10 элементов — от р[0] до р[9]. В следующей программе вычисляются значения элементов массива целого типа с индексами от 0 до 99:
#include <stdio.h> int main(void) { int x[100]; /* объявление массива 100 целых */ int t; /* присваение массиву значений от 0 до 99 */ for(t=0; t<100; ++t) x[t] = t; /* вывод на экран содержимого x */ for(t=0; t<100; ++t) printf("%d ", x[t]); return 0; }
Объем памяти, необходимый для хранения массива, непосредственно определяется его типом и размером. Для одномерного массива количество байтов памяти вычисляется следующим образом:
количество_байтов = sizeof(базовый_тип) × длина_массива
Во время выполнения программы на С не проверяется ни соблюдение границ массивов, ни их содержимое. В область памяти, занятую массивом, может быть записано что угодно, даже программный код. Программист должен сам, где это необходимо, ввести проверку границ индексов. Следующий пример программы компилируется без ошибки, однако при выполнении происходит нарушение границы массива count и разрушение соседних участков памяти:
int count[10], i; /* здесь нарушена граница массива count */ for(i=0; i<100; i++) count[i] = i;
Можно сказать, что одномерный массив — это список, хранящийся в непрерывной области памяти в порядке индексации. На рис. 4.1 показано, как хранится в памяти массив а, начинающийся по адресу 1000 и объявленный как
char a[7];
Элемент a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] Адрес 1000 1001 1002 1003 1004 1005 1006 1007 |