На данный вопрос уже ответили:
union Foo
{
int a;
float b;
long double c;
char d;
};
Как union
может интерпретировать пам'ять для разных типов?
Ну, объединения в С и С++ работают очень просто. Ты указываешь, что вот в этой области памяти у тебя будет несколько полей (в примере 4 штуки), но тип каждого из них разный.
Когда ты обращаешься к каждому из этих полей, компилятор создает соответствующие обращения к одной и той же области памяти (по одному адресу), но с разными размерами.
Твой пример немного синтетический, как его использовать в реальности - не могу придумать. Но вот тебе вполне рабочий пример:
typedef struct {
union {
unsigned int address;
unsigned char bytes[4];
}
} ipv4_address;
В итоге ты можешь обратиться либо к целому адресу как к 32-битному числу (например чтобы его скопировать), а можешь обратиться к каждому байту из 4 штук, чтобы например вывести адрес в нотации X.X.X.X чем-то вроде printf("%d.%d.%d.%d",ipv4.bytes[0],ipv4.bytes[1],ipv4.bytes[2],ipv4.bytes[3])
.
То есть Union позволяет смотреть на одну и ту же область памяти через разные "призмы", вернее через разные типы данных.
В принципе ты можешь наложить int и float. Но хорошее из этого вряд ли что получится, поскольку битовое кодирование целых чисел и чисел с плавающей точкой разное, и придумать задачу, где это может пригодиться, у меня не получается )
Кстати, ты можешь не использовать Union вообще, а пойти опасным путем - приводи адрес переменной одного типа к адресу переменной другого типа.
unsigned int a = 44;
unsigned char *c = (unsigned char *)(&a);
printf("%d", c[3]); // Выводим последний, то есть 4-ый, октет переменной a
Жуть, правда? Никогда так не делай, уж лучше Union. И вообще, это довольно грязные трюки со множеством допущений и подводных камней, в обычной работе лучше сделать то же самое, но надежнее и проще.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Зачем нужен флаг /EHsc для MSVC компилятора? Недавно увидел его в конфиге, почитал доки, но так и не понял о каких синхронных/асинхронных исключениях...
Постоянно вижу в различных учебниках такой синтаксис объявления структур
Не пойму как правильно перегрузить оператор "-" для класса массиваОписание класса: