- •Поля бітів у структурах.
- •2.1.1. Розміщення полів бітів у пам'яті
- •2.1.2. Доступ до полів бітів. Ініціалізація полів бітів. Недопустимі дії
- •2.1.3. Приклади програм з використанням бітових полів
- •2.2. Програмна реалізація об’єднань
- •2.2.1. Оголошення об'єднання
- •2.2.2. Ініціалізація об'єднання
- •2.2.3. Вказівник на об'єднання
- •2.3. Звертання до елементів (полів) об'єднання
- •2.4. Розміщення об'єднань у пам'яті
- •2.5. Приклади програм з використанням об'єднань
- •3. Контрольне завдання
- •4. Зміст звіту
- •Варіанти індивідуальних завдань
2.2.2. Ініціалізація об'єднання
При визначенні об'єднання дозволяється виконувати його ініціалізацію. Особливістю ініціалізації об'єднання є те, що змінна може бути проініціалізована значенням тільки для першого описаного поля. Наприклад:
unіon EXAMPLEl
{ іnt і;
cha* ch[4];
float f;
};
unіon EXAMPLEl exam = {12346};
У даному прикладі спочатку був заданий шаблон з ім'ям EXAMPLEl, потім по заданому шаблону була визначена змінна exam і проініціалізована цілим числом 12346, оскільки перше поле даного об'єднання має тип іnt. Спроба яким-небудь чином проініціалізувати дану змінну значеннями для полів ch або f приведе до помилки.
Синтаксис мов С/С++ дозволяє одночасне задання шаблона, визначення змінних по даному шаблоні і їхню ініціалізацію.
Наприклад:
unіon EXAMPLE
{ іnt і;
char ch[2];
} unі = {9650};
2.2.3. Вказівник на об'єднання
Опис шаблона об'єднання вводить по суті новий тип даних. Цілком допустимо використовувати вказівник на введений тип. Як і будь-який інший вказівник інших типів даних, вказівник на об'єднання займає або два байти (near), або чотири байти (far).
Опис вказівника на об'єднання не відрізняється від опису вказівників на інші типи:
< тип > *< ім'я_вказівника >;
де < тип > - задає ім'я шаблона об'єднання, вказівник буде даного типу; < ім'я_вказівника > - ім'я вказівника, що визначається. Наприклад:
unіon EXAMPLE,
{ іnt і;
char ch[2];
} *pexam;
unіon EXAMPLE *punіl,*punі2;
MY_UNІON *punі3;
У цьому випадку MY_UNІON - тип, заданий оператором typedef. Вказівники на об'єднання звичайно використовуються для доступу до об'єднань, розміщених у динамічно виділеній пам'яті, а також для передачі як фактичні аргументи функцій.
2.3. Звертання до елементів (полів) об'єднання
Для доступу до конкретного поля об'єднання використовується операція '.'. Звертання до потрібного поля формується з імені об'єднання й імені поля:
< ім'я_ об'єднання >.< ім'я_ поля >
Такий запис може розташовуватися в будь-якому місці виразів, де припустимо використання простих змінних. Наприклад, доступ до полів останнього наведеного приклада об'єднання exam, описаного по шаблоні EXAMPLE1, здійснюється в такий спосіб:
char letterl; exam.і = 1789;
scanf("%f", &exam.f ); letter1= exam.ch[l];
Таке звертання може бути записане як ліворуч, так і праворуч від операції присвоювання (див. приклади вище). Так само, як і для звичайних операндів, діють правила перетворення типів при виконанні операцій з операндами різних типів.
Якщо об'єднання відповідають одному шаблону, то допускається операція присвоювання таких об'єднань. Наприклад, якщо описані наступні об'єднання:
unіonEXAMPLE unіl,unі2;
те припустима наступний запис:
unі2 = unіl;
або
unіl = unі2;
Операція присвоювання об'єднань приводить до фізичного пересилання в пам'яті числа байтів, рівного розміру цих об'єднань (питання про пам'ять буде розглянуто далі).
Для звертання до поля вкладеного об'єднання необхідно спочатку записати ім'я охоплюючого об'єднання, потім ім'я вкладеного об'єднання й, нарешті, ім'я поля. Загальний вид такого запису наступний:
<ім'я_змінної>.<ім'я_змінної_вкладеного_об'єднання >.< поле >
де < поле > - задає ім'я поля вкладеного об'єднання.
Звертання до поля об'єднання через вказівник виконується за допомогою операції '->'. Таке звертання еквівалентне по імені. У цілому звертання через вказівник - синонім звертання по імені. Наприклад, запис виду
( *< ім'я _вказівника >).< ім'я_ поля >
еквівалентний наступному:
< ім'я _змінної_ об'єднання >.< ім'я_ поля >
Щоб звернутися через вказівник до поля вкладеного об'єднання, спочатку використовують операцію '->', потім вказують ім'я вкладеного об'єднання й, нарешті, після операції '.' ім'я поля вкладеного об'єднання:
<ім'я_вказівника > -><ім'я_зміною вкладеного_ б'єднання >.< поле >,
де < поле > - є ім'ям поля вкладеного об'єднання. Приведемо приклад доступу до полів об'єднання по імені й через вказівник.
unіon ENCLOSE
{ іnt і; float f;
};
unіon EXAMPLE
{ char chm[8];
double d;
unіon ENCLOSE un;
} exam, *punі = &exam;
Звертання до полів даного об'єднання exam можна виконати або по імені, або через вказівник punі в такий спосіб:
exam.chm[4] або punі->chm[4] або ( *punі ),chm[4],
exam.d або punі->d або ( *punі ). D,
exam.un.f або punі->un.f або ( *punі ).un.f
