Под инициализацией понимают задание значений объектам программы в момент их определения. В языке Basic все числовые объекты и строки постоянной длины инициализируются нулями, строки произвольной длины – "пустой" строкой (""). Средств инициализации другими значениями не предусмотрено, поэтому речь далее пойдет только о языке C.
Любое определение может задать начальное значение определяемого объекта с помощью инициаторов.
Инициатор: =<выражение>|{<список_выражений>}
Все выражения для static и extern объектов – постоянные, для auto и register – произвольные. Если объект типа static или extern не инициируется, то для числовых типов он получает значение нуль, для символьных массивов "" (пустая строка), для указателей – значение символической константы NULL. Другие объекты получают в отведенной области памяти "мусор" (неопределенные значения).
Если объект представляет собой совокупность (структура, массив, объединение), то инициатор имеет вид: {<выражение>[<, выражение>]...}. Выражения – это инициаторы для элементов, записанные в порядке их хранения в памяти. Если совокупность содержит составные подобъекты, то правило рекурсивно распространяется и на них.
Если инициаторов меньше, чем элементов, то оставшиеся инициируются по общим правилам, если больше, то регистрируется ошибка. Для инициализации символьных массивов можно использовать литералы типа string.
Все объекты инициализируются только в момент выделения памяти, по-этому объекты класса памяти static или externпри изменении начальное значение не восстанавливают, а объекты класса памяти auto или register инициализируются каждый раз при входе в функцию или блок, где они определены.
Примеры.
1. Скаляры.
#define SIZE 3
static int dlina=SIZE+1;
int k=n+1;
2. Массивы.
int x[ ]={1,2,3}; // Размерность определяет транслятор по числу инициаторов
float y[4][3]={ // Эквивалентная запись float y[4][3]={1,3,5,2,4,6,3,5,7};
{1,3,5 }, // 0-я строка
{2,4,6 }, // 1-я строка
{3,5,7 } // 2-я строка
}; // 3-я строка:0 (для static|extern) | "мусор" (для auto|register)
float y[4][3]={ // Заполняет только 1-й столбец
{1},
{2},
{3},
{4}
};
3. Символьный массив.
char msg[ ]="Синтаксическая ошибка в строке %s\n";
Длина массива определяется числом инициаторов. Конечный 0 включается.
4. Массив указателей.
/* Выдать название месяца по номеру */
char* month_name(int n){
static char* name[ ]={
"Hеправильный месяц",
"Январь",
"Февраль",
"Март",
"Апрель",
"Май",
"Июнь",
"Июль",
"Август",
"Сентябрь",
"Октябрь",
"Hоябрь",
"Декабрь"
};
return n<1||n>12 ? name[0]:name[n];
} /* End month_name */
5. Массив структур.
static struct{
char *mess; int window[4];
}message[ ]={
{"Имя входного файла", {14,12,35,14}},
{"Имя dbf-файла", {16,12,31,14}},
{"Имя файла программы", {12,12,37,14}}
};