Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры прога 2.docx
Скачиваний:
1
Добавлен:
18.09.2019
Размер:
83.31 Кб
Скачать

39.2,Переименование типов. Средство typedef.

1)параметризация программы связаная с проблемой переносимости. Если с помощью средства typedef объявить типы данных, которые машинно зависимые, то при переносе программы на другую машину потребуется внести изменения только в определение typedef.

2)Кратность , наглядность и удобность.

40.Поля битов.

Язык С допускает использование в структурах полей особого типа – битовых полей (или полей битов). Их использование делает возможным доступ к отдельным битам более крупных объектов. Это позволяет экономнее использовать память. Например : если переменная принимает значения “0” или “1” (флаг), то для ее представления можно использовать 1 бит. Использование групп однобитовых флагов позволяет запаковать несколько объектов в одном машинном слове.

Поле битов – некоторое множество битов, лежащих рядом внутри одной, зависящей от реализации единицы памяти.

Описание поля битов : тип [имя] : ширина;

Тип может быть int, signed, unsigned.

Не допускаются массивы полей битов, указатели на поля битов и функции, возвращающие поля битов.

Каждому битовому полю выделяеться ровно столько бит, сколько указано в поле “ширина”(от 0 до размера длины слова).

Ссылка на битовое поле выполняется по имени, указанном в поле “имя”. Поля могут не иметь имени. В этом случае организуеться пропуск заданного числа бит. Т.е. биты выделяются, но доступ к ним не возможен. Особая ширина безымянного поля, равная 0, используется когда надо выйти на границу следующего слова. Битовое поле может существовать только как элемент структуры и определяет из скольки бит состоит каждый её элемент.

struct имя_типа_структуры {

тип имя1:ширина1;

тип имя2:ширина2;

……….

тип имяN:ширинаN;};

Длина структуры всегда кратна 8;

struct flag{

unsigned one_bit:1;

unsigned two_bit:1;

unsigned three_bit:1;} obj;

Поэтому под переменную obj будет отведено 8 бит, но использоваться будут только первые 3.

В структуре могут быть смешаны обычные переменные и битовые поля. Ссылка к битовым полям obj. one_bit – доступ к полю.

Над битовыми полями возможны следующие операции:

obj.one_bit= obj.two_bit=1;

41.1,Объединения

Объединение – это переменная, которая может содержать в разные моменты времени объекты различных типов и размеров. Фактически объединение – это структура, у которой все её элементы имеют нулевое смещение относительно базового адреса. Размер структуры достаточно велик, чтобы вместить самый большой её элемент, а выравнивание удовлетворяет всем типам объединения. Объединения не могут содержать поля битов. Объявление объединения аналогично объявлению структуры, только вместо слова struct используется union.

union u {

int i;

char c;

long int l;};

union u a,b;

Можно объявить переменные в шаблоне. Переменной типа union выделяется место в памяти (в байтах) ровно столько, сколько нужно для самого большого элемента. Т.е. она будет достаточно большой, чтобы в ней разместились переменные других типов.

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

Помнить о том, какой элемент хранится в объединении, должен программист.

Объединения могут входить в структуры и массивы и наоборот.

struct {

char *name;

int iv;

union {

int i;

float f;

char *s} u;

} sym [nsym];

sym[k].u.i – доступ к полю i объединения u k-того элемента массива структур sym

*sym[k].u.s равносильно sym[k].u.s[o]