Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Объединение как пользовательский тип и совокупность данныхСодержание книги
Поиск на нашем сайте Определение объединения и переменной объединяющего типа Объединения находятся в близком родстве со структурами. Объединением будем называть переменную, созданную, как и в случае структур, по шаблону. Определяютсяшаблоныобъединения (объединяющие типы) с помощью служебного слова union. Объединяющие типы,подобно структурным, содержат поля различных типов, но только размещаются эти поля в одном и том же месте памяти (начинаются с одной границы). Основное назначение объединения – обеспечить возможность доступа к одному и тому же участку памяти с помощью объектов разных типов. Определим переменную UNI объединяющего типа с помощью анонимного шаблона: union { long L; unsigned i1; int i2; char c[4]; } UNI;
Схема размещения переменной UNI в памяти: long L unsigned i1 int i2 char c[4]
т.е. элементы располагаются с одного адреса. Это подтвердит и выполнение следующих операторов: cout << &UNI. L; //все переменные имеют один и тот же адрес cout << &UNI. i1; cout << &UNI. i2; cout << &UNI. c;
Размер памяти, выделяемый переменной объединенного типа, равен максимальному из размеров памяти, выделяемых для отдельных полей шаблона. Структуры могут быть членами объединения, и объединение может быть членом структуры. Разрешается создание и массива объединений. Переменные типа объединение могут быть формальными параметрами и аргументами вызова функций. Чтобы функция не изменила аргумент-объединение при передаче по указателю или ссылке, соответствующий параметр объявляется со спецификатором const. Функция может возвращать переменную-указатель или ссылку типа объединение. Доступ к полям объединения выполняется, аналогично структурам, через уточненное имя: имя_объединения. имя_поля (*указатель_на_объединение). имя_поля указатель_на_объединение -> имя_поля ссылка_на_объединение. имя_поля
Внимание!!! Члены-данные анонимного объединения можно использовать как переменные (если их имена уникальны в контексте объявления). Например: enum week {sun, mon, tues, weds, thurs, fri, sat}; union { // анонимное объединение int i; week w; }; i = 6; if ((w == sun) || (w == sat)) cout << “Это выходные дни!”;
Объединения могут быть опасны, так как их реализация часто зависит от системы.
Использование объединения подобно применению ссылок (один участок памяти имеет несколько различных имен), если элементы объединения имеют одинаковую длину и одинаковый тип и отличаются только именами.
Заносить значения в участок памяти, выделенный для объединения, можно с помощью любого из элементов: union { int ival; float fval; char cval[4]; } uval; Переменной uval можно присваивать любой из трех типов; какой тип в данный момент находится в переменной – должен помнить программист. Но: инициализироваться объединение может только первым описанным полем. Инициализатор объединения – значение для его первого члена, заключенное в фигурные скобки. Например: union int_ flt { int i; float x; } n = {0}; // член (поле) i инициализируется нулем.
n. i = 7; //в объединение записано целое значение cout << n. i << endl; // объединение интерпретируется как имеющее целый тип n. x = 7. 0; // в объединение записано вещественное значение cout << n. x << endl; //объединение интерпретируется как имеющее вещественный тип
Основное достоинство объединений – возможность разных трактовок одного и того же содержимого памяти. Пусть имеем объединение: union {float f; unsigned long k; } FK;
Можно присвоить объединению вещественное значение FK. f = -256.5, а рассматривать его затем как беззнаковое целое: cout << hex << FK.k; //получим с3804000 16.
Если же включить в шаблон объединения массив: union {double f; char h[8]; } FLH;
и выполнить присваивание вещественного значения переменной FLH присваиванием этого значения полю FLH. f, то имеем возможность доступа к отдельным байтам внутреннего представления этого значения с помощью имен FLH. h [0], FLH. h [1], и т.д. Примеры использования объединений
|
|||||||||||||||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 47; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.170.164 (0.006 с.) |