Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

8.7. Оператор typedef

Используя ключевое слово typedef, можно определять новые типы данных (точнее, определять новое имя для уже существующего типа). Это может быть полезным при обеспечении переносимости программ или для более удобного представления типов данных.

Общий вид оператора typedef такой:

typedef тип новое_имя_типа;

где тип – имя любого типа данных Си, а новое_имя_типа – новое имя этого типа, которое будет использоваться совместно с этим типом данных.

Например, если в коде программы по ошибке вместо int написано integer, можно решить эту проблему разными способами, в том числе и следующим:

typedef int integer;

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

8.8. Поля битов в структурах

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

Синтаксис определения и обработки полей базируется на структурах. В общем виде определение поля следующее:

тип имя : длина;

Тип может быть signed int или unsigned int. При этом каждому полю выделяется столько бит, сколько указано.

struct

{

unsigned int pol:1;

unsigned m:1;

int k:2;

} stat;

Обращение к полям осуществляется следующим образом

stat.pol = 0;

Как и элемент структурной переменной, каждое поле доступно с помощью оператора точка.

Поля позволяют рационально использовать свободную память. Однако, существуют и минусы их использования: невозможно получить адрес поля; манипуляции с битовыми полями машинно-зависимы (например, в некоторых машинах битовые поля могут пересекать границы машинного слова, тогда как в других машинах это недопустимо); использование полей битов может привести к тому, что компилятор будет генерировать машинный код, который выполняется с низкой скоростью (приходится использовать дополнительные операции машинного языка для получения доступа к отдельным частям адресуемых элементов памяти).

8.9. Объединения

Объединение внешне напоминает структуры и может хранить в различные моменты времени данные различного типа и размера. Как и для структур, объявление объединения состоит из:

  1. задание шаблона объединения;

  2. объявление переменной типа объединения.

Объявление объединения начинается с ключевого слова union и в общем случае выглядит следующим образом:

union [имя_типа_объединения]

{

тип имя_члена;

тип имя_члена;

.

.

.

тип имя_члена;

} [одна или более переменных объединения];

Например:

union pole

{

int n;

float m;

char s;

} var;

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

Доступ к членам объединения осуществляется с помощью оператора точка (для получения доступа к объединению с помощью указателя используется оператор стрелка ->).

var.m = 1; // элементу m из var присваивается значение 1

void f1(union pole *p)

{

...

p->m = 2; // элементу m из var присваивается значение 2

...

}

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

var.m = 0; // теперь все члены объединения равны 0

var.s = 65; // после этого младший байт двух остальных

// членов объединения станет равным 65, т.е.,

// например, при чтении var.n получим тоже 65