Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

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

С позволяет инициализировать глобальные и локальные массивы на этапе объявления. Стандартный вид инициализации массива аналогичен инициализации переменных, как показано ниже: спецификатор типа имя_массива [размерN] ... [размер1] = {список значений}; Список значений - это разделенный запятыми список констант, совместимых по типу со спецификатором типа. Первая константа помещается в первый элемент массива, вторая - во второй и так далее. За последней константой списка нет запятой. Обратим внимание, что точка с запятой следует за }. В следующем примере 10-элементный целочисленный массив инициализируется числами от 1 до 10: int i [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Это означает, что i[0] получит значение 1, i[9] - 10.

Массивы символов, содержащие строки, допускают удобную инициализацию в виде char имя_массива [размер] = "строка"; При данной инициализации нулевой терминатор автоматически добавляется к концу строки. Нижеприведенный фрагмент кода инициализирует строку str фразой «hello»: char str[6] = "hello"; Это можно также записать: char str [ 6 ] = {'h', 'е', 'l', 'l', 'o', '\0'}; Обратим внимание, что в данной версии следует явным образом указать нулевой символ. Поскольку все строки в С оканчиваются нулевым символом, следует убедиться, что массив достаточно длинный для его вмещения. Именно поэтому str состоит из 6 символов, хотя «hello» имеет только 5 символов.

Многомерные массивы инициализируются так же, как и одномерные. Следующий пример инициализирует sqrs числами от 1 до 10 и их квадратами: int sqrs[10] [2] = { 1, 1 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100 }; Здесь sqrs[0][0] содержит 1, sqrs[0][1] содержит 1, sqrs[1][0] содержит 2, sqrs[1][1] содержит 4 и так далее.

При инициализации многомерных массивов можно добавить фигурные скобки вокруг каждого измерения. Это так называемая субагрегатная группировка. Ниже приведен еще о дня способ записи предыдущего объявления: int sqrs[10][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25}, {6, 36}, {7, 49}, {8, 64}, {9, 81}, {10, 100} };

При использовании субагрегатной группировки в случае неуказания требуемого количества инициализаторов для данной группы остальные члены установятся в 0 автоматически.

Инициализация безразмерных массивов

Представим, что используется инициализация массивов для создания таблицы сообщений об ошибках, как показано ниже: char e1[12] = "Read Error\n"; char e2[13] = "Write Error\n"; char e3[18] = "Cannot Open File\n"; Как можно было догадаться, было бы очень скучно вручную подсчитывать число символов каждого сообщения для определения корректной размерности массива. Имеется возможность определять размерность массива автоматически при использовании безразмерных массивов. Если размер массива не определен в инициализационной части, компилятор С автоматически создает массив с размером, достаточным для хранения всех указанных инициализаторов. Используя данный способ, можно переписать таблицу сообщений следующим образом: char e1[] = "Read Error\n"; char e2[] = "Write Error\n"; char e3[] = "Cannot Open File\n"; Имея такую инициализацию, оператор printf("%s has length %d\n", e2, sizeof e2); выводит write error has length 13 Помимо того, что данный способ менее скучен, метод инициализации безразмерных массивов позволяет свободно изменять любое из сообщений и не бояться неправильно подсчитать число символов.

Инициализация безразмерных массивов не ограничивается одномерными массивами. Для многомерных массивов необходимо определить все размерности, кроме самой левой, чтобы С мог правильно индексировать массив. (Аналогично определению параметров массива.) Используя данный способ, можно создавать таблицы с переменной длиной, и компилятор будет автоматически выделять необходимое для их хранения место. Ниже показано объявление sqrs как безразмерного массива: Int sqrs[][2] = { 1, 1 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100 }; Преимущество данного объявления над версией с размерами состоит в том, что таблица может удлиняться или укорачиваться без изменения размерностей массива.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]