- •Занятие 10 Пользовательские типы данных
- •1. Структурный тип данных
- •1.1 Определение структуры
- •Int year; //год
- •Int year; //год
- •2. Оператор typedef
- •9.3 Определение структуры безымянного типа
- •9.4 Доступ к элементам структуры
- •9.5 Операции присваивания и сравнения для структур
- •9.7 Битовые поля
- •9.8 Объединения или смеси
- •9.9 Перечисления
Int year; //год
};
Синтаксис определения элементов структуры аналогичен синтаксису определения переменной. Необходимо указать типы данных каждого элемента и размер всех строк и массивов. Определение каждого элемента структуры заканчивается ;. Конец структуры также определяется ; .
Определение сообщает компилятору, сколько памяти следует зарезервировать для каждого элемента новой структуры, сама же память не выделяется.
Написав определение структуры, можно пользоваться новым типом данных – создавать переменные, указатели, массивы и т.п. Название нового типа в нашем примере будет struct date.
Память выделяется при создании объектов структурного типа, т.е. при их объявлении.
Пример 2. Выделение памяти под переменную days типа struct date.
…
struct date days;
После такого определения компилятор выделяет память под структурную переменную days, которая состоит из двух переменных типа int и массива из 15 элементов типа char.
Выделение памяти под структурные объекты можно совместить с определением структурного типа.
Пример 3.
struct date
{ int day; //день
char month[15]; //месяц
Int year; //год
} a, b, c;
При этом выделяется соответствующая память под три переменные структурного типа – a, b, c.
Выделенное имя нового типа позже также можно использовать для объявления разнообразных структурных объектов, можно создать переменную, массив или указатель структурного типа.
Пример 4. Определить структуру (создать новый тип) и объявит структуру (выделить память под переменные нового структурного типа) для хранения информации о товаре на складе. Каждая позиция склада содержит разнотипную информацию о товаре, например, название, цену, количество, дату поступления.
strucr tovar
{char name[20]; //наименование
double prise; //цена
int vol; //количество
date in_date; //дата поступления
} food;
Такое определение создает новый структурный тип tovar и выделяет память под структурную переменную с именем food. Переменные, подобные food, называют объектами структурного типа или же структурными переменными, но чаще всего структурами. Из-за этого может возникнуть некоторая терминологическая путаница, т.е. имя нового структурного типа тоже можно назвать структурой. Эти два понятия различают по контексту, структурный тип создается один раз и затем используется при создании программных объектов. Сами же объекты (структуры) создаются каждый раз, когда необходимо выделить память для размещения данных.
Примеры использования нового типа struct tovar для создания различных объектов:
struct tovar book; //переменная-структура с именем book
struct tovar sklad2[1000]; //массив структур с именем sklad2
struct tovar *point_f; // указатель на структуру tovar с именем point_f
При необходимости структуры можно инициализировать, помещая вслед за описание список начальных значений элементов.
В следующем примере инициализируются переменные birthday (тип struct date) и food (тип struct tovar):
…
char sname[]="масло";
struct date birthday={20,"февраля", 1975};
struct tovar food ={&sname, 20.6, 50, {11, "марта", 2011}};
При определении разрешается вкладывать структуры друг в друга. Следующий пример демонстрирует использование вложенных структур.
Пример 5. В примере определяется структура man, для хранения информации о человеке – имя, фамилия, дата рождения, ИНН.
struct man
{char name[20], fam[30];
struct date bd;
int INN;
};
Структура man включает 4 элемента name, fam, bd, INN. Первые два – это символьные массивы различной длины, переменная bd представлена составным элементом (вложенной структурой) типа date, а переменная INN – это целое число типа int. Определенный выше тип date имеет три элемента – day, month, year. Теперь можно определить объекты, значения которых принадлежат новому типу:
struct man list[100];
Здесь определен массив list, состоящий из 100 структур типа man.