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

Оператор typedef.

Рассмотрим описание структуры:

struct data {int d, m. у;};

Фактически вводится новый тип данных – data. Теперь его можно использовать для объявления конкретных экземпляров структуры, например:

struct data а, b, с:

В язык С введено специальное средство, позволяющее назначать имена новым типам данных. Таким средством является оператор typedef. Он записывается в следующем виде:

typedef тип имя;

Здесь «тип» – любой разрешенный тип данных и «имя» -любой разрешенный идентификатор. Рассмотрим пример:

typedef int INTEGER;

После этого можно сделать объявление:

INTEGER а, b;

Оно будет выполнять то же самое, что и привычное объявление:

int а, b;

Другими словами, INTEGER можно использовать как синоним ключевого слова int. При этом можно комбинировать объявления со словами (int и INTEGER, например:

INTEGER а, b;

int с. d;

Здесь объявлены четыре переменные (а, b, с, d) целого типа.

Битовые поля.

Особую разновидность структур представляют поля. Поле-это последовательность соседних. битов внутри одного целого значения. Оно может иметь тип signed int либо unsigned int и занимать от1 до 16 битов. Поля размещаются в машинном слове в направлении от младших к старшим разрядам. Например, структура:

struct prim { int а:2;

unsigned b:3;

int:5;

int с:1;

unsigned d:5:} i, j;

обеспечивает размещение данных в двух байтах (в одном слове). Если, бы последнее поле было задано так: unsigned d:6; то оно размещалось бы не в первом слове, а в разрядах 0  5 второго слова.

В полях типа signed крайний левый бит является знаковым. Например, такое поле шириной 1 бит может только хранить значения -1 и 0, так как любая ненулевая величина будет интерпретироваться как -1.

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

Смеси (объединения).

Смесь – это некоторая переменная, которая может хранить (в разное время) объекты различного типа и размера. В результате появляется возможность работы в одной и той же области памяти с данными различного вида. Для описания смеси используется ключевое слово union, а соответствующий синтаксис аналогичен записям. Пусть задано объявление:

union r {int ir; float fr; char cr;} z;

Здесь ir имеет размер 2 байт, fr-4 байт и cr-l байт. Переменная z будет достаточно велика, чтобы сохранять самый большой из трех приведенных типов. Таким образом, размер z будет 4 байт. В один и тот же момент времени z может иметь значение только одной из указанных переменных (ir, fr, cr).

Перечисляемый тип данных.

Перечисляемый тип данных предназначен для описания объектов из некоторого заданного множества. Он определяется ключевым словом enum. Рассмотрим пример:

enum seasons {spring, summer, autumn, winter};

Здесь введен новый тип данных seasons. Теперь можно объявить переменные этого типа:

enum seasons a, b, с;

Каждая из них (а, b, с) может принимать одно из четырех значений: spring, summer, autumn и winter. Эти переменные можно было объявить сразу при описании типа:

enum seasons {spring, summer, autumn, winter} a, b, с:

Рассмотрим другое объявление:

enum days {mon, tues, wed, thur, fri, sat, sun} my_week;

Имена, занесенные в days, представляют собой константы целого типа. Первая из них (mon) автоматически устанавливается в нуль, и каждая следующая имеет значение на единицу больше, чем предыдущая (tues=l, wed=2 и т. п.). Можно присвоить константам определенные значения целого типа (именам, не имеющим их, будут, как и раньше, назначены значения предыдущих констант, увеличенные на единицу). Например:

enum days {mon = 5, tues=8, wed=10, thur, fri, sat, sun} my_week;

После этого mon=5, tues=8, wed=10, thur=11, fri=12, sat=13, sun=14.

Тип enum можно использовать для задания констант true= l и false = 0, например: enum t_f {false, true} a, b;