union TU4
{ char ch[4];
long a; // b) short a; // c) unsigned a;
} U4;
U4.a=0x30334142; // или U4.a=0x30334142L;
cout<<endl<<"Size of union "<<sizeof(U4)<<endl;
for(int i=3; i>=0; i--)
cout<<U4.ch[i]<<" ";
cout<< endl<< U4.a<<endl;
cout<<hex<< U4.a<<endl;
В качестве упражнения провести компьютерный эксперимент, изменив объявление (см. в комментариях) и (или) выбрав другое число. Объяснить полученные результаты.
Рассмотрим следующее, например, анонимное объединение:
union
{int k; float f;};
f=25.6;
cout<<k;
Будет выведено 41cccccd ( см. объединение U1 ). Этот пример показывает, что объединение чем-то похоже на ссылочный тип. Но в отличие от последнего одна и та же ячейка не просто по-разному называется. Её содержимое можно интерпретировать с разными типами данных.
Как и для структур, можно объявить и использовать ссылки и указатели на объединение.
Например, после объявления TU4 &SU=U4 к одной и той же области памяти из четырёх байт можно обращаться как с помощью идентификатора SU (SU.ch[i]), так и с помощью U4 (U4.ch[i]).
Объявим указатель на объединение:
|
|
TU3 *pU3=new TU3;
Тогда доступ к полям осуществляется, как и для указателя на структуру, с помощью операции ->. Например
pU3->N=0x12345678L;
cout<< hex<<pU3->N<<endl;
cout<<hex<<pU3->w.lo<<endl;
cout<<hex<<pU3->w.hi<<endl;
Заметим, что внутри объединения используется по-прежнему просто структура, а не указатель на неё. Поэтому остаётся и операция точка для доступа к полям вложенной структуры w.