Объединением называется область памяти, использующаяся для хранения данных разных типов. Причем одновременно в объединении могут храниться данные только одного определенного типа. Данные входящие в объединение называются его полями (элементами). Тип описывающий объединение также называется объединением.
С помощью объединения к одной и той же области памяти можно обращаться как к данным различного типа. Объединение можно рассматривать как структуру, все элементы которой имеют одинаковый начальный адрес в памяти. Длина объединения определяется наибольшей из длин полей объединения. Объединения позволяют сэкономить память в том случае, если необходимо хранить только один из элементов объединения, но заранее неизвестно, какой именно. Синтаксис объединений аналогичен синтаксису структур. union [имя_типа_объединения] { тип_1 элемент_1; тип_2 элемент_2; … тип_n элемент_n; }
union num { int n; double f; } union num d; //d-переменная типа num (в C) num d; // (в C++)
В переменной d могут храниться целые и плавающие числа, но не оба одновременно. Длина переменной d = длине max элемента (в данном случае double). При объявлении типа объединения его можно инициализировать значением, которое имеет тип 1-го элемента объединения.
union num e={10}; //правильно, e=10
Имена элементов переменной типа объединения принадлежат локальной области видимости внутри блока. Для доступа к элементам объединения используется оператор (.). num e, g; e.n=1; e.f=2.7; Над объединениями одного типа возможна операция присваивания. g=e; Для доступа к элементам объединения на которые указывает указатель используется оператор(->).
void print(char c, union *un) {switch(c) {case 'd': {printf("n=%d\n",un->n); break;} case 'f': {printf("n=%f\n",un->f); break;} default: printf("union\n"); } } Объединение (как и структура) не может содержать в качестве элементов переменные собственного типа. Но в качестве элементов объединения могут использоваться указатели или ссылки на переменные собственного типа объединения. В C++ при использовании объединений следует учитывать некоторые особенности, так объединение является классом и может содержать в себе также функции в качестве элементов.
Битовые поля Поля битов – это особый тип полей структуры. Они используются, если нужно запомнить данные, для которых необходима ячейка памяти менее одного байта. Это могут быть, например, флажки, которым достаточно одного бита для представления значений в двоичной логике. Битовыми полями называются элементы структуры или объединения, которые определяются как последовательность битов. Синтаксис описания битового поля следующий: Идентификатор_типа [имя_поля]: ширина_поля; В качестве идентификатора_типа в соответствии со стандартом ANSI разрешено использовать ключевые слова int, signed или unsigned. Ширина_поля должна быть выражена целочисленным значением, которое определяет, сколько битов необходимо выделить указанному полю. Пример struct status { unsigned Shadow: 1; unsigned Border: 1; unsigned Palette: 3; unsigned Hline: 1; unsigned F1Activ: 1; } К битовым полям не может быть применена операция получения адреса (&) и поэтому не существует указателей на поля. Порядок размещения битовых полей памяти в значительной степени зависит от компилятора и аппаратного обеспечения. Не нужно пытаться экономить память с помощью битовых полей, так как это чаще всего не удается. При использовании битовых полей обычно предполагается, что память для них будет выделена в виде последовательности битовых ячеек, следовательно, указанная в примере структура, состоящая из битовых полей, заняла бы 7 бит, следующих один за другим; но так ли это на самом деле - зависит, в конце концов, от компилятора. Кроме того, адресация отдельных битов в памяти является менее рациональной, чем адресация байтов или слов, так как компилятор должен генерировать специальные коды. Непоименованные битовые поля с шириной поля 0 задают выравнивание следующего поля по границе слова. Инициализируются битовые поля как обычные элементы структуры. status a={0,1,1,2,1}; Если надо обрабатывать только некоторые биты из поля, то остальные биты можно не именовать. struct s { unsigned b1:1; unsigned: 8; // не именованное поле unsigned b2:1; }
Объявление typedef В языке Си можно определить любые типы данных на основе встроенных типов. При определении типа указываются его идентификатор и идентификатор существующего типа. Такое определение типа происходит через ключевые слова struct, union или typedef.
Пример typedef int length; // синоним названия типа Функция typedef позволяет создать свое собственное имя типа. Например, после инструкции typedef float real; можно использовать real для объявления переменных: real x, y[50], *p; Область действия такого определения зависит от расположения оператора typedef. typedef struct person {char name[20]; int post_code; } PERSON; Теперь можно объявлять переменные типа PERSON и работать с ними как с типом person.
typedef void (*func_typ) (int, int) Тип func_typ - определяется как “указатель на функцию с двумя параметрами типа int и не возвращающую значения".
· Описания типа используют, чтобы создать легко запоминающиеся имена. · Описания типа используют, чтобы создать сокращения для обширных типов (struct, class, указатель на функцию). · Описания типов позволяют решить проблему при переносе программного обеспечения. Если с помощью typedef объявить типы данных, которые являются машинно-зависимыми, то при переносе программы на другую машину потребуется внести изменения только в определения typedef.
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав!Последнее добавление