Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
53
Добавлен:
11.05.2015
Размер:
547.84 Кб
Скачать

Тема № 4. Организация данных. Массивы и указатели Массивы

Кроме одиночных переменных, представляющих в программе отдельное число или символ, в языке С определено понятие массива. Массив – это совокупность (последовательность) значений одного типа. Для объявления массива в программе используется следующий синтаксис:

int Array[10]; // Массив из десяти целых чисел

Для доступа к отдельному элементу массива введено понятие индекса – т.е. номер элемента в массиве, причем индекс массива, состоящего из N элементов, меняется от 0 до N – 1. Так массив int Arr[3];

содержит элементы Arr[0], Arr[1], Arr[2].

Синтаксическая форма

<тип> <имя> <размер N> … <размер 2><размер 1>;

Как и в предыдущем случае, массив представляется одним фрагментом памяти, в котором элементы располагаются друг за другом:

int matr [2][3];

matr[0][0] : matr[0][1] : matr[0][2] : matr[1][0] : matr[1][1] : matr[1][2]

Инициализация массивов

При объявлении массивов их можно инициализировать, т.е. присвоить элементам конкретные значения.

Инициализация – это объединение определения объекта с одновременным присваиванием ему конкретного значения. Она позволяет изменить формат определения массива. Например, можно явно не указывать количество элементов одномерного массива, а только перечислить их начальные значения в списке инициализации:

double seq [] = {1.0, 2.1, 3.2, 4.3, 5.0};

В данном примере будет определен одномерный массив из пяти элементов, причем

seq[0]=1.0 seq[1]=2.1 seq[2]=3.2 seq[3]=4.3 seq[4]=5.0

Если в определении массива явно задан его размер, то количество начальных значений не может быть больше количества элементов в массиве (в таком случае компилятор выдаст ошибку типа «too many initializers»).

В случае, когда количество начальных значений меньше заданного размера массива – будут присвоены начальные значения только группе первых элементов массива (элементам с меньшим значением индекса):

int seq [4] = {1, 2};

В данном примере будут определены только элементы seq[0]=1 и seq[1]=2, в то время как элементы seq[2] и seq[3]останутся неопределенными.

Как видно из представленных примеров, одномерный массив инициализируется заключенным в фигурные скобки списком начальных значений. При инициализации многомерных массивов, в соответствии с определением их как одномерного массива с элементами-массивами, используются вложенные фигурные скобки.

int matr[3][2] = {{2,3}, {4,5}, {6,7}};

Эта запись эквивалентна последовательности операторов присваивания:

matr[0][0]=2 matr[0][1]=3 matr[1][0]=4 matr[1][1]=5 matr[2][0]=6 matr[2][1]=7

Тот же самый результат можно получить с одним списком инициализации в форме:

int matr[3][2] = {2, 3, 4, 5, 6, 7};

Как и для одномерных массивов могут быть проинициализированы не все значения многомерного массива:

double M[4][6] = { {1.0}, {2.2}, {44.2}, {8.0} };

  • начальные значения получат элементы только первого столбца матрицы M.

В многомерных массивах требуется некоторое время на вычисление каждого индекса. Поэтому доступ к элементу в многомерных массивах происходит медленнее, чем доступ в одномерных массивах. Поэтому для многомерных массивов память чаще всего выделяется динамически.

В С отсутствует проверка границ массивов. Можно легко выйти за конец массива и записать значение в какую-либо область, не относящуюся к массиву. Вся работа по проверке границ массива возлагается на программиста.

Массивы символов. Массивы символов, содержащие строки, допускают удобную инициализацию в виде:

char <имя_массива> [размер] = “строка”;

char str [6] = “hello”;