Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 96; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.006 с.) |