- •Структуры и другие типы данных.
- •Установка структурного шаблона.
- •Определение структурных переменных.
- •Создание простой структуры. ( тут не знаю как лучше)
- •Инициализация структуры.
- •Доступ к элементам структуры.
- •Передача структур в функции.
- •Создание массива структур.
- •Описание массива структур.
- •Определение элементов массива структур.
- •Вложенные структуры.
- •Использование указателей на структуры.
- •Описание и инициализация указателя на структуру.
- •Доступ к элементу структуры при помощи указателя.
- •Передача информации о структурах функциям. Использование элементов структуры.
- •Передача массива структур в функцию.
- •Дополнительные манипуляции со структурами.
- •Передача членов структуры в функцию.
- •Передача информации о структурах функциям. Использование элементов структуры.
- •Передача информации о структурах функциям. Использование адреса структуры.
- •Передача информации о структурах функциям. Использование массива.
- •Имя массива можно использовать для передачи в функцию указателя на первую структуру в массиве.
- •Затем можно использовать арифметическую операцию над указателем, чтобы передвигать его на последующие структуры в массиве. Заметим, что вызов функции
- •Структуры внутри структур.
- •Структуры и битовые поля.
- •Структуры. Их дальнейшее использование.
- •Объединения.
- •Шаблон объединения.
- •Объединения: синтаксис и правила.
- •Создание простого объединения.
- •Вспомогательные средства.
- •Использование typedef.
- •Сложные формы данных.
- •Использование enum.
Дополнительные манипуляции со структурами.
Имеются несколько моментов, касающихся структур и не рассмотренных в последних нескольких примерах. Например: в функцию можно также передать отдельные элементы структуры. Другая возможность относится к вложенным структурам.
Передача членов структуры в функцию.
Передача отдельных элементов структуры — это простой и эффективный способ ограничения доступа к данным структуры внутри функции. Например, функция может использоваться для печати оптовых цен всех катеров, имеющихся в реестре. Для этого нужно передать в функцию только один элемент структуры — оптовую цену fwholesale. В этом случае вызов функции выглядит так:
vprint_price(astNineveh.fwholesale);
В этом операторе vprint_price() — имя функции, a astNineveh.fwholesale — имя структуры и ее элемент.
Передача информации о структурах функциям. Использование элементов структуры.
Поскольку элемент структуры является переменной с единственным значением (т. е. типа int или одного из его «родственников» — char, float, double или указатель), он может быть передан как аргумент функции. Простая программа финансовых расчетов, которая прибавляет взнос клиента к его счету, иллюстрирует этот способ. Заметим, между прочим, что мы объединили определение шаблона, описание переменной и инициализацию в один оператор.
/* передача элементов структуры как аргументов функции */
#include<stdio.h>
struct funds {
char *bank;
float bankfund;
char *save;
float savefund; } stan = {
"Senior tomatoes Bank",
1023.43,
"Savings and lendings of Snoopy",
4239.87
};
float sum(float x, float y);
void main()
{
float total;
extern struct funds stan; /* необязательное описание */
total=sum(stan.bankfund, stan.savefund);
printf ("Stan has only %.2f dollars.\n", total);
}
/* складывает два числа типа float */
float sum(float x, float y)
{
return x+y;
}
Результат выполнения этой программы:
У Стэна всего 5263.30 долл.
Вот это да, она работает. Заметим, что функция sum() «не знает», или же ей безразлично, являются ли элементами структуры фактические аргументы; она только «требует», чтобы они имели тип float.
Конечно, если вы хотите, чтобы программа воздействовала на значение элемента в вызывающей программе, можно передать ей адрес этого элемента:
modify(&stan.bankfund);
и тогда получилась бы функция, которая изменила бы банковский счет в структуре Stan.
Второй способ передачи информации о структуре заключается в возможности сообщить суммирующей функции, что она имеет дело со структурой.
Передача информации о структурах функциям. Использование адреса структуры.
аргументы функции передают значения в функцию. Структура гораздо сложнее, чем отдельная переменная, поэтому неудивительно, что саму структуру нельзя использовать в качестве аргумента функции. (Это ограничение снято в некоторых новых реализациях.)
Передача информации о структурах функциям. Использование адреса структуры.
Мы будем решать ту же самую задачу, что и прежде, но при
Для передачи информации о структуре функции можно использовать адрес структуры в качестве аргумента. Это хорошо, поскольку адрес представляет собой только одно число. Так как функция должна работать со структурой funds, она тоже должна использовать шаблон структуры funds.
/* передача адреса структуры в функцию */
#include<stdio.h>
struct funds {
char *bank;
float bankfund;
char *save;
float savefund; } stan = {
"Senior tomatoes Bank",
1023.43,
"Savings and lendings of Snoopy",
4239.87
};
float sum(struct funds *);
void main()
{
float total;
total=sum(&stan);
printf ("Stan has only %.2f dollars.\n", total );
}
float sum(struct funds *money)
{
return ( money->bankfund + money->savefund);
}
Эта программа тоже выдает
У Стэна всего 5263.30 долл.
Функция sum() имеет указатель (money) на структуру fund. Передача адреса &stan в функцию заставляет указатель money ссылаться на структуру stan. Затем используем операцию - > для получения значений элементов stan.bankfund и stan.savefund.
Эта функция также имеет доступ к названиям учреждений, хотя их не использует.
Заметим, что мы должны применять операцию & для получения адреса структуры. В отличие от имени массива имя структуры само по себе не является синонимом своего адреса.
Наш следующий способ применим к массивам структур и является вариантом данного способа.
Передача информации о структурах функциям. Использование массива.
аргументы функции передают значения в функцию. Структура гораздо сложнее, чем отдельная переменная, поэтому неудивительно, что саму структуру нельзя использовать в качестве аргумента функции. (Это ограничение снято в некоторых новых реализациях.)