Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
361
Добавлен:
02.05.2014
Размер:
1.3 Mб
Скачать

Доступ к компонентам структуры

Такой доступ осуществляется с помощью специального обозначения для выделенного компонента, имеющего следующий вид:

s.c

где s является именем структуры или значением структуры с компонентом c. s может быть выражением, дающим в результате значение структуры. Например, s может быть вызовом функции со структурой в качестве ее значения. К компонентам определенной выше структуры date1 можно обратиться, указав их обозначения:

date1.year

date1.month

date1.day

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

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

Пример:

struct bfeg {

unsigned int bf_flg1 : 10;

unsigned int bf_flg2 : 6;

};

Данная структура описывает 10-битовое поле, которое для вычислений преобразуется в значение типа unsigned int, и 6-битовое поле, которое обрабатывается как значение типа unsigned int.

Объединения

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

Определение объединенного типа данных аналогично определению структурного типа данных:

union имя_объединения {

Описания_элементов

};

Пример:

union bigword {

long bg_long;

char *bg_char [4];

};

Данные типа union bigword занимают память, необходимую для размещения наибольшего из своих элементов, и выравниваются в памяти к границе, удовлетворяющей ограничениям по адресации как для типа long, так и для типа char *[4].

Описание переменной объединенного типа:

Пример:

union bigword x;

union bigword *p;

union bigword a[100];

Перечисления

Данные перечислимого типа относятся к некоторому ограниченному множеству данных.

Определение перечислимого типа данных:

enum имя_перечислимого_типа {

Список_значений

};

Каждое значение данного перечислимого типа задается идентификатором.

Пример:

enum color {

red, green, yellow

};

Описание переменной перечислимого типа:

enum color chair;

enum color suite [40];

Использование переменной перечислимого типа в выражении.

Пример:

chair = red;

suite[5] != yellow;

Переменные структуры

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

struct {

общие компоненты;

метка активного компонента;

union {

описание компонента 1

описание компонента 2

...

описание компонента n

} идентификатор;

}

Ниже приведен пример определения переменной структуры health_record:

struct {

/* общая информация */

char name[25];

int age;

char sex;

/* метка активного компонента */

marital_status ms;

/* переменная часть */

union {

/* холост */

/* нет компонентов */

/* женат */

struct {

char marriage_date[8];

char spouse_name[25];

int no_children;

}

/* разведен */

char date_divorced[8];

} marital_info;

} health_record;

где тип marital_status, т.е. тип метки активного компонента ms, описан как

typedef enum {SINGL,MARRIED, DIVORCED}

marital_status;

Ниже приведены несколько примеров ссылки на компоненты переменной структуры:

health_record.name

healts_record.ms

health_record.marital_info.marriage_date