Пример 4. long a; // b) short a; // c) unsigned a

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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: