Язык программирования C



         

Структуры и функции - часть 2


pd->year

является новой. Если p - указатель на структуру, то

p-> член структуры ------------------

обращается к конкретному члену. (Операция -> - это знак минус, за которым следует знак ">".)

Так как pd указывает на структуру, то к члену year можно обратиться и следующим образом

(*pd).year

но указатели структур используются настолько часто, что запись -> оказывается удобным сокращением. круглые скобки в (*pd).year необходимы, потому что операция указания члена структуры старше , чем *. Обе операции, "->" и ".", ассоциируются слева направо, так что конструкции слева и справа эквивалентны

p->q->memb (p->q)->memb emp.birthdate.month (emp.birthdate).month

Для полноты ниже приводится другая функция, month_day, переписанная с использованием структур.

month_day(pd) /* set month and day from day of year */ struct date *pd; { int i, leap;

leap = pd->year % 4 == 0 && pd->year % 100 != 0 || pd->year % 400 == 0; pd->day = pd->yearday; for (i = 1; pd->day > day_tab[leap][i]; i++) pd->day -= day_tab[leap][i]; pd->month = i; }

Операции работы со структурами "->" и "." наряду со () для списка аргументов и [] для индексов находятся на самом верху иерархии старшинства операций и, следовательно, связываются очень крепко. Если, например, имеется описание

struct { int x; int *y; } *p;

то выражение

++p->x

увеличивает x, а не p, так как оно эквивалентно выражению ++(p->х). Для изменения порядка выполнения операций можно использовать круглые скобки: (++p)->x увеличивает p до доступа к x, а (p++)->x увеличивает p после. (Круглые скобки в последнем случае необязательны. Почему?)

Совершенно аналогично *p->y извлекает то, на что указывает y; *p->y++ увеличивает y после обработки того, на что он указывает (точно так же, как и *s++); (*p->y)++ увеличивает то, на что указывает y; *p++->y увеличивает p после выборки того, на что указывает y.




Содержание  Назад  Вперед