Учебное пособие: Структуры и объединения
Имя_структуры.элемент_структуры
Операция доступа к элементу структуры ‘.’ соединяет имя структуры и имя элемента.
Например,
struct time t = {21, 30};
printf("%d:%d", t.hour, t.minutes);
Структуры могут быть вложены друг в друга. Например, структура chronos содержит две структуры timebegin и end:
struct chronos {
struct time begin, end;
};
struct chronos timer = {{2,4}, {10, 10}};
Выражение timer.begin.minutesобращается к минутам minutesвремени beginиз timer.
В стандарте ANSIC ключевое слово struct при объявлении структурных переменных можно опускать, то есть допустима и общепринята запись .
chronos timer;
Размер структуры в байтах складывается из размера его элементов. Например, sizeof(timer) = 8 байт. Однако, если включена опция компилятора Options-Compiler-Code generation-Word allgnment, то все элементы будут располагаться по четным адресам. Поэтому в случае
struct FIO { char F[25], I[15], Otch[20]};
будем иметь sizeof(FIO) = 26 + 16 + 20 = 62.
Структуры и функции
Над структурами возможны следующие операции:
- присваивание,
- взятие адреса с помощью &,
- осуществление доступа к ее элементам.
Присваивание используется при передаче структуры в функцию по значению и возврат структуры по значению. Структуры нельзя сравнивать. Инициализировать структуру можно списком константных значений ее элементов; автоматическую структуру также можно инициализировать присваиванием.
Чтобы лучше познакомиться со структурами, напишем несколько функций, манипулирующих time и chronos. Возникает вопрос: а как передавать функциям названные объекты? Существует, по крайней мере, три подхода: передавать компоненты по отдельности, передавать всю структуру целиком и передавать указатель на структуру. Каждый подход имеет свои плюсы и минусы.
Первая функция, maketime, получает два целых значения и возвращает структуру time.
/* maketime: формирует время по компонентам hour и minutes */
time maketime(int hour, int minutes){
time temp;
temp.hour = hour;
temp.minutes = minutes;
return temp;