Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры и объединения11111 (2).docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
72.64 Кб
Скачать

Int pages;

};

//Далее надо объявить указатель на структуру:

book * une;

une = new ( book); // выделение памяти на одну структуру

delete une;// освобождение памяти

une = new book [9];// выделение памяти на массив структур

une[0].name = "Денисов";

delete [ ] une ;//освобождение памяти

Объединения разнотипных данных

Объединение - это структура, все элементы которой размещены на одном и том же участке памяти.

Размер участка памяти, выделяемого для объединения, определяется максимальным из размеров его элементов.

Все элементы объединения имеют нулевое смещение от его начала, или все элементы имеют один и тот же начальный адрес.

Объединения целесообразно использовать в следующих случаях:

- для преобразования типов, одно и тоже значение (набор нулей и единичек) рассматривается то, как значение одного типа, то, как значение другого типа;

-основное назначение – обеспечить возможность доступа к отдельным частям внутреннего представления объединения (к отдельным байтам, если включить в объединение символьный массив нужной длины, или даже битам, что и рассмотрим ниже)

Итак - основное назначение объединений – обеспечить возможность доступа к одному и тому же участку памяти с помощью объектов разных типов – элементов объединения. Это позволяет трактовать содержимое одного и того же участка памяти как значения данных разных типов и иметь доступ к отдельным участкам памяти объединения.

Определение объединения внешне похоже на определение структуры.

Определение объединяющего типа:

union имя_типа {список описаний элементов_объединения через ';'};

Однотипные члены можно описывать с одним идентификатором типа и через запятую.

Пример:

union un { long L; double D; char C[3]; } uni;

Здесь объявлен объединяющий тип un и переменная этого типа uni.

На рис. 1.2 проиллюстрировано внутреннее представление объединения uni.

a95a0

байт

байт

байт

байт

байт

байт

байт

байт

char C[3]

long L

double D

Рис. 2. Схема размещения в памяти объединения uni

Все элементы объединения имеют один и тот же адрес и результатом оператора вывода:

cout<<&uni.L<<&uni.D<<&uni.C;

будет трижды выведен один и тот же адрес, равный в данном случае a95a0.

После определения типа объединения можно (по аналогии со структурой) определять конкретные объекты:

un u1, um [4] // объединение и массив объединений

un * pu// указатель на объединение

un&ru=u1 //ссылка на объединение

Форматы обращения к элементам объединения:

имя_объединения.имя_элемента

имя_указателя_на объединение -> имя_элемента

(*имя_указателя_на_объединение). имя_элемента

Можно присваивать, вводить и выводить значения элементов.

Включение в объединение в качестве элемента символьный массив длинной с участок памяти, выделенный под объединение, позволяет обращаться к каждому байту памяти внутреннего представления объединения.

Например, определим объединение (рис. 1.3)

union { float fl; unsigned long l; char h[4]; } u;

Массив символов char h[4]

h[0]

h[1]

h[2]

h[3]

байт

байт

байт

байт

unsigned long l

float fl

Рис. 3. Размещение в памяти объединения u

Занося в участок памяти, выделенный для объединения, вещественное число, например, так:

u.fl=2.718282f;

можно получить значение кода его внутреннего представления с помощью уточненного имени u.l и значения кодов, находящихся в отдельных байтах: u.h[0], u.h[1], u.h[2], u.h[3].

Элементами объединения могут быть также массивы и структуры, возможны самые разнообразные их сочетания.

Разрешена инициализация объединений. Если при определении объединения надо провести его инициализация, то следует инициализировать только первый элемент объединения:

union comp { long L; int i [2] ; char ch[4] ; };

comp u1 ={ 123456 };

comp u2 = { 'a', 'b', 'c' , 'd' }; // ошибка

union { char ch [4]; long L; int i [2];}= { 'a', 'b', 'c', 'd' }; //правильно

Можно создать анонимное объединение без явного указания имени типа и не вводить имя самого объединения

union { int im [3]; char ch[6];}= { 1, 2, 3 };

К элементам анонимного объединения обращаются как к отдельным объектам (переменным):

im [0]=10 ; // изменится также значениеch[0] и ch[1]

ch[5] = 'k'// изменится и значение im [3]

Можно определять массивы объединений и инициализировать их:

comp M [ ] = { 10L, 20L , 30L , 40L };

Количество элементов массива в данном случае определяется инициализацией.

Инициализация проводится для первого элемента каждого объединения массива. Доступ к внутренним кодам возможен через элементы M [i]. ch[ k].

Соседние файлы в предмете Вводный курс программирования