Язык Си - руководство для начинающих
Шрифт:
Доступ к элементу структуры при помощи указателя
him ссылается на структуру fellow[0]. Каким образом можно использовать him для получения значения элемента структуры fellow[0]? Третья выведенная строка даст для этого два способа.
Первый способ, наиболее общий, использует новую операцию – >. Она заключается в вводе дефиса (– ) и следующего за ним символа "больше чем" (>).
him -> income - это fellow[0].income,
если him = &fellow[0]
Другими словами, структурный указатель, за которым следует операция – >, работает так же, как имя структуры с последующей операцией ".". (Мы не можем сказать him.income, потому что him не является именем структуры.)
Очень важно отметить, что him– указатель, а him - > income– элемент структуры, на которую делается ссылка. Таким образом, в этом случае him - > income является переменной типа float.
Второй способ определения значения элемента структуры вытекает из последовательности:
если him == &fellow[0], то *him == fellow[0]. Это так, поскольку & и *– взаимообратные операции. Следовательно, после подстановки
fellow[0].income == (*him).income
Круглые скобки необходимы, поскольку операция "." имеет приоритет выше, чем *.
Отсюда можно сделать вывод, что если him является указателем на структуру fellow[0], то следующие обозначения эквивалентны:
fellow[0].income == (*him).income == him->income
Давайте теперь посмотрим, как взаимодействуют структуры и функции.
Резюме: операции над структурами и объединениями
Эта операция используется с именем структуры или объединения для определения элемента этой структуры или объединения. Если name является именем структуры, a member– элементом, определенным структурным шаблоном, то name.member обозначает этот элемент структуры. Операция получения элемента может использоваться таким же образом для объединений.
Примеры
struct {
int code;
float cost;
} item;
item.code = 1265;
Данный оператор присваивает значение элементу code структуры item.
II. ОПЕРАЦИЯ КОСВЕННОГО ПОЛУЧЕНИЯ ЭЛЕМЕНТА: ->
Эта операция используется с указателем на структуру или объединение для определения элемента структуры или объединения. Предположим, что ptrstr является указателем на
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, у);