Введение |
Операторы |
Операции |
Переменные и типы |
Пояснения к курсовой работе |
Препроцессор |
Работа с файлами |
Стандарты безопасного кодирования |
Указатели и динамическая память |
Функции и модули |
Ввод-вывод |
Объединение в языке С связано с математическим понятием объединения множеств.
Например, мы можем объединить множество целых чисел ℤ и множество символов CC:
A = ZZ cup CC
Значение a in A может быть либо целым числом, либо символом, но не одновременно. Для хранения значения такого типа достаточно использовать max(sizeof(int),sizeof(char))
байт памяти,
но нужно где-то хранить информацию, из какого множества используется значение.
Объявление типа для объединения похоже на объявление типа для структуры, и рекомендуется объявить перечисление для переменной, хранящей информацию о варианте. Обращение к нужному варианту значения выглядит как обращение к полю структуры. Значение, указанное в списке инициализации, всегда используется для первого варианта, но можно явно указать имя варианта через tt"." "имя_варианта" ="выражение"
#include <stdio.h>
typedef union {
long i;
char c;
struct { double x, y; } point;
} unionA;
typedef enum { isLONG, isCHAR, isPOINT } tipA;
int main() {
unionA a={-1}; // значение типа long
tipA ta=isINT; // текущий тип a, попробуйте изменить на isPOINT
switch(ta) {
case isLONG: printf("%ld\n", a.i);
break;
case isCHAR: printf("%c\n", a.c);
break;
case isPOINT: printf("%lf %lf\n", a.point.x, a.point.y);
}
}
Чаще всего объединение и переменная для текущего типа хранятся как два поля в одной структуре.
Так как возможны ошибки обращения к неправильному варианту текущего значения, то вместо объединений лучше использовать обычные структуры, если требования к памяти не являются критическими.