Программирование · 4 min read · Oct 10, 2025

Изучение C/C++ шаг за шагом - Страница 11

11. Шаг за Шагом C/C++ — Программирование на C - Объединения

Объединения

| | 1. Введение

  1. Объединение
  2. Объявление объединения
  3. Определение переменной объединения
  4. Разница между структурой и объединением
  5. Операции с объединениями
  6. Область видимости объединения |

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. Объединение хранит значения разных типов в одном месте в памяти.

  1. Объединение может содержать одно из многих различных типов значений, но только одно хранится в данный момент.
  2. Объединение хранит значение только для одного типа данных. Если сделано новое присвоение, предыдущее значение теряет свою действительность.
  3. В объединении может быть любое количество членов. Но переменная типа объединения занимает наибольшее количество памяти, занимаемое ее членами. |

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;
} |

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.