Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка по С++.doc
Скачиваний:
7
Добавлен:
28.08.2019
Размер:
250.88 Кб
Скачать

7.2. Объединения (смеси)

Объединение подобно структуре, однако в каждый момент времени может использоваться только один из элементов объединения. Тип объединения может задаваться в следующем виде:

union имя{

описание элемента 1;

...

описание элемента n;

};

Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти, т.е. они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат не был бессмысленным.

Доступ к элементам объединения осуществляется тем же способом, что и к структурам.

Объединение применяется для следующих целей:

1. инициализации используемого объекта памяти, если в каждый момент времени только один объект из многих является активным;

2. интерпретации основного представления объекта одного типа, как если бы этому объекту был присвоен другой тип.

Память, которая соответствует переменной типа объединения, определяется величиной, необходимой для размещения наиболее длинного элемента объединения. Когда используется элемент меньшей длины, то переменная типа объединения может содержать неиспользуемую память. Все элементы объединения хранятся в одной и той же области памяти, начиная с одного адреса.

Пример:

#include <stdio.h>

int main()

{

union slovo{

unsigned int r;

unsigned char f[2];

} b;

b.r=0xa21c;

printf("b.f[0]=%x b.f[1]=%x\n",b.f[0],b.f[1]);

return 0;

}

Объединение b типа slovo состоит из двух полей r типа unsigned int и f — массив из двух элементов типа unsigned char. Оба поля расположены в памяти по одному адресу. Все объединение занимаем два байта памяти. Полю r приписывается шестнадцатеричное значение A21C. Расположение в памяти нулевого элемента массива f совпадает с младшим байтом пиля r, а первого элемента массива f — со старшим байтом поля r. Данная программа выведет на экран следующую надпись

b.f[0]=1c b.f[1]=a2

7.3. Поля битов

Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур битовые поля объявлять нельзя. Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса. В общем случае тип структуры с битовым полем задается в следующем виде:

struct имя{

тип идентификатор 1 : длина_поля 1;

тип идентификатор 2 : длина_поля 2;

};

Длинна_поля задается целым выражением или константой. Эта константа определяет число битов, отведенное соответствующему полю. Поле нулевой длинны обозначает выравнивание на границу следующего слова. Тип идентификатора может быть любым целочисленным.

Пример:

struct bits{

unsigned a1 : 1;

unsigned a2 : 2;

unsigned a3 : 5;

unsigned a4 : 2;

} b;

Ссылки на поле битов выполняются точно так же, как и компоненты общих структур. Само же битовое поле рассматривается как целое число, максимальное значение которого определяется длиной поля.

8. Ввод-вывод

В стандарте языка Си отсутствуют средства ввода-вывода. Все операции ввода-вывода реализуются с помощью функций, находящихся в библиотеке языка Си, поставляемой в составе конкретной системы программирования Си.

Все файлы рассматриваются как неструктурированная последовательность байтов. При таком подходе к организации файлов можно распространить понятие файла и на различные устройства. Одни и те же функции библиотеки языка Си используются как для обмена данными с файлами, так и для обмена с устройствами. Данный подход был впервые применен при разработке операционной системы Unix.

Библиотека языка Си поддерживает три уровня ввода-вывода: потоковый ввод-вывод, ввод-вывод нижнего уровня и ввод-вывод для консоли и портов.