Учебное пособие: Структуры и объединения
Заметим: никакого конфликта между именем аргумента и именем элемента структуры не возникает; более того, сходство подчеркивает родство обозначаемых им объектов.
Теперь с помощью maketime можно выполнять динамическую инициализацию структуры или формировать структурные аргументы для той или иной функции:
chronos timer;
timer.begin = maketime(0, 0);
timer.end = maketime(12, 5);
Следующий шаг состоит в определении ряда функций, реализующих различные операции над временем. В качестве примера рассмотрим следующую функцию:
/* addtime: сложение времени */
time addtime (time tm1, time tm2)
{
tm1.minutes += tm2.minutes;
tm1.hour += tm2.hour + tm1.minutes/60;
tm1.minutes %= 60;
return tm1;
}
Здесь оба аргумента и возвращаемое значение - структуры.
В качестве другого примера приведем функцию tinchronos, которая проверяет: находится ли данный момент времени внутри нашего интервала.
/* tinchronos: возвращает 1, если t в c, и 0 в противном случае */
int tinchronos (struct time t, struct chronos c)
{
return t.hour >= c.begin.hour
&& t.hour < c.end.hour
&& t.minutes >= c.begin.minutes
&& t.minutes < c.end.minutes;
}
Указатели на структуры
Так как имя структурного типа обладает всеми правами имен типов, то разрешено определять указатели на структуры:
имя_структурного_типа * имя_указателя_на_структуру;
Если функции передается большая структура, то, чем копировать ее целиком, эффективнее передать указатель на нее. Указатели на структуры ничем не отличаются от указателей на обычные переменные. Объявление
time *pt;
сообщает, что pt - это указатель на структуру типа struct time. Если pt указывает на структуру time, то *pt - это сама структура, а (*pt).hour и (*pt).minutes - ее элементы. Используя указатель pt, мы могли бы написать