- •Структуры и объединения Структура как совокупность данных
- •Int maks [3];
- •Представления структуры в памяти эвм.
- •1) Функция может возвращать структуру как результат:
- •2) Функция может возвращать указатель на структуру:
- •3) Функция возвращает ссылку на структуру:
- •Int pages;
- •Объединения разнотипных данных
- •Битовые поля структур и объединений
- •Int main ( ) {
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].

байт