Программирование · 4 min read · Oct 10, 2025
Изучение C/C++ шаг за шагом - Страница 11
11. Шаг за Шагом C/C++ — Программирование на C - Объединения
Объединения
| | 1. Введение
- Объединение
- Объявление объединения
- Определение переменной объединения
- Разница между структурой и объединением
- Операции с объединениями
- Область видимости объединения |
1. Введение
| | / 81_union.c /
#include
struct s_emp
{
int eno;
char name[20];
float sal;
};
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct s_emp se;
union u_emp ue;
printf(“\nРазмер структуры Employee : %d”, sizeof(se));
printf(“\nРазмер объединения Employee : %d”, sizeof(ue));
return 0;
} | | | Вывод: Размер структуры Employee : 26
Размер объединения Employee : 20 |
2. Объединение
Когда в программе требуется большое количество переменных, они занимают много памяти. Объединения предоставляют самый простой способ экономии памяти, используя технику замещения. Они используют одно и то же место в памяти для всех типов переменных.
Объединение - это тип данных в C, который позволяет накладывать более одной переменной в одной и той же области памяти.
Характеристики объединений:
| | 1. Объединение хранит значения разных типов в одном месте в памяти.
- Объединение может содержать одно из многих различных типов значений, но только одно хранится в данный момент.
- Объединение хранит значение только для одного типа данных. Если сделано новое присвоение, предыдущее значение теряет свою действительность.
- В объединении может быть любое количество членов. Но переменная типа объединения занимает наибольшее количество памяти, занимаемое ее членами. |
3. Объявление объединения
Объединение - это тип данных, с помощью которого объекты разных типов и размеров могут храниться в разное время. Определение объединения такое же, как и у структуры. Единственное изменение в объявлении - это замена ключевого слова union на ключевое слово struct.
| |
|
Пример:
| | union ddate
{
int day;
int month;
int year;
}; | union student
{
int sno;
char name[20];
int marks;
float avg;
}; |
4. Определение переменной объединения
Определение переменной объединения такое же, как и у структуры, и такое же, как для определения встроенного типа данных, такого как int.
| | int a; / Верно /
union date d; / Верно как в C, так и в C++ / |
Расчет размера объединения
Каждый тип данных в C/C++ имеет заданный размер, т.е. int имеет размер 2 байта, float имеет размер 4 байта и так далее. Вот способ узнать размер переменной объединения.
sizeof:- Эта функция используется для определения размера данной переменной.
| | printf(“%d”, sizeof(int)); / 2 /
printf(“%d”, sizeof(float)); / 4 /
printf(“%d”, sizeof(union emp)); / Отображает размер объединения emp / |
5. Разница между структурами и объединениями
Вот разница между структурами и объединениями
| Структура | Объединение ** |
| 1. Она может хранить разные типы (переменные) в одном месте. | 1. Она может хранить разные типы (переменные) в разных местах. |
| 2. Она может содержать более одного типа (переменной), но только одна хранится в данный момент. | 2. Она может содержать более одного типа (переменной), все хранятся в памяти одновременно. |
| 3. В объединении может быть любое количество членов. Но переменная типа объединения занимает наибольшее количество памяти, занимаемое ее членом. | 3. Она требует памяти размером со всех своих членов. |
| 4. В процессе работы можно получить доступ только к одному члену в любой данный момент. | 4. В процессе работы ко всем членам можно получить доступ в любое время. |
| 5. Область видимости объединения - это функция, и область видимости его членов также такая же, как и у самого объединения. (Их можно получить доступ напрямую в программе). | 5. Область видимости структуры - это только функция. Члены структуры не могут быть доступны напрямую в программе. |
6. Операции с объединениями
Объединение также похоже на структуру, оно может выполнять все операции, как структуры. Операции с объединением перечислены ниже.
| | • Переменной объединения можно присвоить значение другой переменной объединения.
• Переменная объединения может быть передана функции в качестве параметра
• Адрес переменной объединения можно получить с помощью оператора адреса (&).
• Функция может принимать и возвращать объединение или указатель на объединение. |
| | / 82_union.c /
#include
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf(“Введите номер сотрудника : “); scanf(“%d”, &ue.eno);
printf(“Введите имя сотрудника : “); scanf(“%s”, ue.name);
printf(“Введите зарплату сотрудника : “); scanf(“%f”, &ue.sal);
printf(“\n\nДанные сотрудника следующие… “);
printf(“%d %s %f “, ue.eno, ue.name, ue.sal);
return 0;
} |
| | Каков вывод?
Только ue.sal правильный. Что насчет остальных переменных. |
В любой момент только одна из переменных объединения будет иметь значимое значение. Только тот член, который был записан последним, можно прочитать. В этот момент другие переменные будут содержать мусор. Это ответственность программиста - отслеживать активную переменную (т.е. переменную, к которой последний раз обращались).
Вот лучший способ принять и отобразить записи сотрудника.
| | / 83_emp.c /
#include
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf(“\nВведите номер сотрудника : “); scanf(“%d”, &ue.eno);
printf(“\n%d”, ue.eno);
printf(“\nВведите имя сотрудника : “); scanf(“%s”, ue.name);
printf(“\n%s”, ue.name);
printf(“\nВведите зарплату сотрудника : “); scanf(“%f”, &ue.sal);
printf(“\n%f”,ue.sal);
return 0;
} |
7. Область видимости объединения
Область видимости объединения отличается от структуры. Переменная структуры может быть доступна только ее функциям. В то время как объединение и его члены могут быть доступны его функцией.
| | / 84_scope.c /
#include
int main()
{
union
{
int i;
char c;
float f;
};
i = 10; c = ‘a’; f = 4.5; / Члены объединения /
printf(“Значение c: %c”, c);
return 0;
} |
Get new posts in your inbox
No spam. Unsubscribe anytime.