Таблица 4. Массив структур.
название | автор | г од издания | |
lib[0] | lib[0].title | lib[0].author | lib[0].year |
lib[1] | lib[1].title | lib[1].author | lib[1].year |
lib[2] | lib[2].title | lib[2].author | lib[2].year |
lib[99 | lib[99].title | lib[99].author | lib[99].year |
Структуры можно автоматически инициализировать при их объявлении подобно массивам, используя следующий синтаксис:
struct bool lib = {
"Евгений Онегин",
"Пушкин А.С.",
1995
};
При выполнении данного фрагмента программы в переменные структуры title, author и year будет записана соответственно информация:
“Евгений Онегин”, “Пушкин А.С.”, 1995.
Здесь следует обратить внимание, что последовательность данных при инициализации должна соответствовать последовательности полей в структуре. Это накладывает определенные ограничения, т.к. при инициализации необходимо помнить последовательность полей в структуре.
Стандарт C99 допускает более гибкий механизм инициализации полей структуры:
struct book lib = {.year = 1995,
.author = "Пушкин А.С.",
.title = "Евгений Онегин" };
или
struct book lib = { .year = 1995,
.title = "Евгений Онегин" };
или
struct book lib = {.author = "Пушкин А.С.",
.title = "Евгений Онегин",
1995 };
В первом и во втором примерах при инициализации указываются наименования полей через точку.
При этом их порядок и число не имеет значения. В третьем примере первые два поля указаны через имена, а последнее инициализируется по порядковому номеру - третьему, который соответствует полю year.
В некоторых случаях имеет смысл создавать структуры, которые содержат в себе другие (вложенные) структуры.
Например, при создании простого банка данных о сотрудниках предприятия целесообразно ввести, по крайней мере, две структуры.
Одна из них будет содержать информацию о фамилии, имени и отчестве сотрудника, а вторая будет включать в себя первую с добавлением полей о профессии и возрасте:
struct tag_fio
{ char last[100];
char first[100];
char otch[100];
};
struct tag_people