II. ОПЕРАЦИЯ КОСВЕННОГО ПОЛУЧЕНИЯ ЭЛЕМЕНТА: ->
Эта операция используется с указателем на структуру или объединение для определения элемента структуры или объединения. Предположим, что ptrstrявляется указателем на структуру и что memberэлемент, определенный структурным шаблоном. Тогда
ptrstr -> member
определяет элемент, на который выполняется ссылка. Операцию косвенного обращения к элементу можно использовать таким же образом и для объединений.
Пример
struct {
int code
float cost;
} item, *ptrst;
ptrst = &item;
ptrst -> code = 3451;
Операторы присваивают значение элементу code структуры item. Следующие три выражения эквивалентны:
ptrst->code item.code (*ptrst).code
ПЕРЕДАЧА ИНФОРМАЦИИ О СТРУКТУРАХ ФУНКЦИЯМ
Вспомним, что аргументы функции передают значения в функцию. Каждое значение является либо числом типа intили float, либо ASCII-кодом или адресом. Структура гораздо сложнее, чем отдельная переменная, поэтому неудивительно, что саму структуру нельзя использовать в качестве аргумента функции. (Это ограничение снято в некоторых новых рeализациях.) Однако есть способы ввести информацию о структуре внутрь функции. Рассмотрим три способа (на самом деле два с вариациями).
Использование элементов структуры
Поскольку элемент структуры является переменной с единственным значением (т.е. типа intили одного из его "родственников" - char, float, doubleили указатель), он может быть передан как аргумент функции. Простая программа финансовых расчетов на рис. 14.6, которая прибавляет взнос клиента к его счету, иллюстрирует этот способ. Заметим, между прочим, что мы объединили определение шаблона, описание переменной и инициализацию в один оператор.
/* передача элементов структуры как аргументов функции */
struct funds {
char *bank;
float bankfund;
char *save;
float savefund; }
stan = { " Банк синьора Помидора",
1023.43,
" Сбережения и займы Снупи",
4239.87 };
main( )
{
float total, sum( );
extern struct funds stan; /* необязательное описание */
printf("У Стэна всего %.2f долл.\n", sum(stan.bankfund,
stan.savefund));
}
/* складывает два числа типа float */
float sum(x, у);
float x, у;
{ return( x + y); }
РИС. 14.6. Программа, передающая функции аргументы, являющиеся элементами структуры.
Результат выполнения этой программы:
У Стэна всего 5263.30 долл.
Вот это да, она работает. Заметим, что функция sum( )"не знает", или же си безразлично, являются ли элементами структуры фактические аргументы; она только "требует", чтобы они имели тип float.
Конечно, если вы хотите, чтобы программа воздействовала на значение элемента в вызывающей программе, можно передать ей адрес этого элемента:
modify(&stan.bank fund);
и тогда получилась бы функция, которая изменила бы банковский счет в структуре stan.
Второй способ передачи информации о структуре заключается в возможности сообщить суммирующей функции, что она имеет дело со структурой.
Использование адреса структуры
Мы будем решать ту же самую задачу, что и прежде, но при этом использовать адрес структуры в качестве аргумента. Это хорошо, поскольку адрес представляет собой только одно число. Так как функция должна работать со структурой funds, она тоже должна использовать шаблон funds. См. рис. 14.7.

/* передача адреса структуры в функцию */
struct funds {
char *bank;
float bankfund;
char *save;
float savefund;
} stan = {
"Банк синьора Помидора" ,
1023.43,
" Сбережения и займы Снупи" ,
4239.87
};
main( )
{
float total, sum( );
printf(" У Стэна всего %.2f долл.\n", sum(&stan) );
}
float sum (money)
struct funds *money;
}
return( money-> bankfund + money-> savefund);
}
PИC. 14.7. Программа, передающая функции адрес структуры. Эта программа тоже выдает
У Стэна всего 5263.30 долл.
Функция sum( )имеет указатель ( money) на структуру fund. Передача адреса &stanв функцию заставляет указатель moneyссылаться на структуру stan. Затем используем операцию - >для получения значений элементов stan.bankfundи stan.savefund.
Читать дальше