Л. № 7, 2012 -2013 г. , Ионов Ю. Г. Объединения 1. Способы описания объединения. Примеры. 2. Определение элементов объединения. Примеры. 3. Доступ к элементам объединения. Адресные выражения. Примеры. 4. Выделение памяти под объединения. 5. Примеры программ , использующих объединения.
Тема: Объединение. Краткие сведения. Объединение – это тоже структура, но которая на момент объявления создает только одно поле (наибольшее) из объявленных. 14. 02. 2018 2
Объявление объединения (union) Примеры: union { }; описание элемента 1; . . . описание элемента n; Операция точка: inform. fio ua. al[0] Операция стрелка : pp_1 ->name union { char fio[30]; char adres[80]; int vozrast; int telefon; } inform; // union { int ax, name; char al[2]; } ua, *pp_1; - поля доступ к членам объединения: имя объединения. член или указатель объединения ->член, то есть точно так же, как и в случае структур. 14. 02. 2018 3
Замечание об инициализации объединений Так как поля объединения это альтернативы, то инициализировать одновременно все поля невозможно. Однако инициализация не отменяет возможности использовать другие поля. (см. пример) 14. 02. 2018 #include
Л. № 5, 2012 -2013 г. , Ионов Ю. Г. Пример программы (слайды 4 -7) // Побитовая печать содержимого регистра данных # include
unsigned char cod (int a, int b) { union { unsigned char z; // z – используется для упаковки struct { unsigned int x: 4; // Младшие четыре бита unsigned int y: 4; // Старшие четыре бита } hh; //hh - экземпляр структуры } un; //un - экземпляр объединения un. hh. x = a%16; un. hh. y = b%16; return un. z; // Упаковка в один байт и его передача } // еnd cod //ниже описана функция binar() - распаковки и побитовой // печати числа, возвращенного функцией cod(). 14. 02. 2018 6
void binar (unsigned char ch) { union { unsigned char ss; struct { unsigned a 0: 1; unsigned a 1: 1; unsigned a 2: 1; unsigned a 3: 1; unsigned a 4: 1; unsigned a 5: 1; unsigned a 6: 1; unsigned a 7: 1; } byte; } cod; cod. ss = ch; //Печатаем, как предписано заголовком, т. е. со старшего //бита. printf ("n. Номера битов: 7 6 5 4 3 2 1 0"); printf ("n. Значения битов: %d %d", cod. byte. a 7, cod. byte. a 6, cod. byte. a 5, cod. byte. a 4, cod. byte. a 3, cod. byte. a 2, cod. byte. a 1, cod. byte. a 0); } 14. 02. 2018 7
Результаты выполнения программы: // // 14. 02. 2018 m=1 - входные данные n=3 cod 49 номера битов: 7 6 5 4 3 2 1 0 значения битов: 0 0 1 1 0 0 0 1 m=0 - входные данные n=1 cod 16 номера битов: 7 6 5 4 3 2 1 0 значения битов: 0 0 0 1 0 0 8


