Лекции по проге / 14_Типы данных, определяемые пользователем
.pdf
Пример обращения к полям структуры
/* у операции "точка" приоритет выше, чем у операции *, поэтому используем скобки */
printf("%s %f",(*topStudent).FIO, (*topStudent).avg_rating);
31
Объединение
● Объединение представляет собой частный случай структуры, все поля которой располагаются по одному адресу (занимают один участок памяти)
● Переменная-объединение может хранить разнотипные значения — в каждый момент времени хранится значение только одного поля
● Размер объединения определяется размером его
наибольшего поля
32
Различие структур и объединений
структура |
|
объединение |
|
|||||||||||||||
struct my_struct |
|
union my_union |
|
|||||||||||||||
{ |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
char field1[6]; |
|
char field1[6]; |
|
|||||||||||||||
int field2; |
|
int field2; |
|
|||||||||||||||
}; |
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct my_struct |
|
union my_union |
|
|||||||||||||||
field1 |
|
|
|
|
|
|
|
|
|
field1, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
field2 |
|
|
|
|
|
|
|
|
|
field2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33
Свойства объединений
●Объединения объявляются таким же образом, как и
структуры, но с использованием ключевого слова union
●При инициализации объединения в фигурных скобках указывается значение ее первого поля
●К объединениям применяются те же операции, что и к структурам
●Объединение не хранит информацию о том, какому полю было присвоено значение
34
Свойства объединений
●Объединение позволяет присвоить значение одному полю, а затем считать это же значение через другое поле
●В общем случае результат такой операции предсказать невозможно — он зависит от способа хранения значений того или иного типа
35
Задание
Указать, что будет напечатано на экране
union my_union
{
char field1[6]; int field2;
} instance;
instance.field2 = 33333; puts( instance.field1 );
36
Обращение к полям объединения
instance.field2 = 33333;
instance field1
35
82
0
0 


puts( instance.field1 ); 5B
'5' — символ с кодом 35, 'B' — символ с ко- 37 дом 82
Использование объединений
● Поскольку нет способа определить, какому полю объединения было присвоено значение, то объединение обычно применяют в составе структуры, содержащей идентификационное поле
● Идентификационное поле определяет, какому полю объединения присвоено значение
● Объединение при этом, как правило, является ано-
нимным
38
Задание
Объявить структуру s_grade для хранения оценки студента либо в числовой, либо строковой форме
Структура должна содержать следующие поля:
●идентификационное поле — type: 0 — оценка в числовом формате, 1 — оценка в строковом формате
●оценка — grade — объединение из строкового и
39 |
числового полей |
|
Пример использования объединения
// Оценка в числовом и строковом форматах struct s_grade
{
int type; |
// 0 - число, 1 - строка |
|
union |
|
|
{ |
|
|
char str_grade[21]; |
// в виде строки |
|
int int_grade; |
// в виде числа |
|
} grade; |
|
|
};
40
