Содержание
Возврат к предыдущей части 1.2.11 Определение обьектов и типов
При объявлении переменной ей можно присвоить начальное значение, присоединяя инициатор к описателю. Инициатор начинается со знака «=» и имеет следующие формы.
Формат 1: = инициатор;
Формат 2: = { список — инициаторов };
Формат 1 используется при инициализации переменных основных типов и указателей, а формат 2 — при инициализации составных объектов.
Примеры:
1 | char tol = 'N'; |
Переменная tol инициализируется символом ‘N’.
1 | const long megabute = (1024 * 1024); |
Немодифицируемая переменная megabute инициализируется константным выражением после чего она не может быть изменена.
1 | static int b[2][2] = {1,2,3,4}; |
Инициализируется двухмерный массив b целых величин элементам массива присваиваются значения из списка. Эта же инициализация может быть выполнена следующим образом :
1 | static int b[2][2] = { { 1,2 }, { 3,4 } }; |
При инициализации массива можно опустить одну или несколько размерностей
1 | static int b[3[] = { { 1,2 }, { 3,4 } }; |
Если при инициализации указано меньше значений для строк, то оставшиеся элементы инициализируются 0, т.е. при описании
1 | static int b[2][2] = { { 1,2 }, { 3 } }; |
элементы первой строки получат значения 1 и 2, а второй 3 и 0.
При инициализации составных объектов, нужно внимательно следить за использованием скобок и списков инициализаторов.
Примеры:
1 2 3 4 | struct complex { double real; double imag; } comp [2][3] = { { {1,1}, {2,3}, {4,5} }, { {6,7}, {8,9}, {10,11} } }; |
В данном примере инициализируется массив структур comp из двух строк и трех столбцов, где каждая структура состоит из двух элементов real и imag.
1 2 | struct complex comp2 [2][3] = { {1,1},{2,3},{4,5}, {6,7},{8,9},{10,11} }; |
В этом примере компилятор интерпретирует рассматриваемые фигурные скобки следующим образом:
- первая левая фигурная скобка — начало составного инициатора для массива comp2;
- вторая левая фигурная скобка — начало инициализации первой строки массива comp2[0]. Значения 1,1 присваиваются двум элементам первой структуры;
- первая правая скобка (после 1) указывает компилятору, что список инициаторов для строки массива окончен, и элементы оставшихся структур в строке comp[0] автоматически инициализируются нулем;
- аналогично список {2,3} инициализирует первую структуру в строке comp[1], а оставшиеся структуры массива обращаются в нули;
- на следующий список инициализаторов {4,5} компилятор будет сообщать о возможной ошибке так как строка 3 в массиве comp2 отсутствует.
При инициализации объединения задается значение первого элемента объединения в соответствии с его типом.
Пример:
1 2 3 | union tab { unsigned char name[10]; int tab1; } pers = {'A','H','T','O','H'}; |
Инициализируется переменная pers.name, и так как это массив, для его инициализации требуется список значений в фигурных скобках. Первые пять элементов массива инициализируются значениями из списка, остальные нулями.
Инициализацию массива символов можно выполнить путем использования строкового литерала.
1 | char stroka[ ] = "привет"; |
Инициализируется массив символов из 7 элементов, последним элементом (седьмым) будет символ ‘\0’, которым завершаются все строковые литералы.
В том случае, если задается размер массива, а строковый литерал длиннее, чем размер массива, то лишние символы отбрасываются.
Следующее объявление инициализирует переменную stroka как массив, состоящий из семи элементов.
1 | char stroka[5] = "привет"; |
В переменную stroka попадают первые пять элементов литерала, а символы ‘Т’ и ‘\0’ отбрасываются.
Если строка короче, чем размер массива, то оставшиеся элементы массива заполняются нулями.
Отметим, что инициализация переменной типа tab может иметь следующий вид:
1 | union tab pers1 = "Антон"; |
и, таким образом, в символьный массив попадут символы:
‘А’,’Н’,’Т’,’О’,’Н’,’\0′,
Читать далее. Раздел 1.2.13 Комментарии в программе
Содержание