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



         

Структуры и функции


В языке "C" существует ряд ограничений на использование структур. Обязательные правила заключаются в том, что единственные операции, которые вы можете проводить со структурами, состоят в определении ее адреса с помощью операции & и доступе к одному из ее членов. Это влечет за собой то, что структуры нельзя присваивать или копировать как целое, и что они не могут быть переданы функциям или возвращены ими. (В последующих версиях эти ограничения будут сняты). На указатели структур эти ограничения однако не накладываются, так что структуры и функции все же могут с удобством работать совместно. И наконец, автоматические структуры, как и автоматические массивы, не могут быть инициализированы; инициализация возможна только в случае внешних или статических структур.

Давайте разберем некоторые из этих вопросов, переписав с этой целью функции преобразования даты из предыдущей лекции так, чтобы они использовали структуры. Так как правила запрещают непосредственную передачу структуры функции, то мы должны либо передавать отдельно компоненты, либо передать указатель всей структуры. Первая возможность демонстрируется на примере функции day_of_year, как мы ее написали в лекции №5:

d.yearday = day_of_year(d.year, d.month, d.day);

другой способ состоит в передаче указателя. если мы опишем hiredate как

struct date hiredate;

и перепишем day_of_year нужным образом, мы сможем тогда написать

hiredate yearday = day_of_year(&hiredate);

передавая указатель на hiredate функции day_of_year. функция должна быть модифицирована, потому что ее аргумент теперь является указателем, а не списком переменных.

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

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

описание

struct date *pd;

говорит, что pd является указателем структуры типа date. Запись, показанная на примере




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