Объединения и перечисления. Указатели и структуры. Массив структур.

Объединения

 

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

 

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

 

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];

 

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

 

Пример:

 

char = red;

 

suite[5] != yellow;

 

 

Указатели и структуры

 

Рассмотрим метку структуры student, описание которой было дано выше как

 

struct student {

 

char name[25];

 

int id, age;

 

char sex;

 

}

 

Указатель new_student определен как

 

struct student *new_student;

 

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

 

(*new_student).name

 

(*new_student).id

 

(*new_student).age

 

(*new_student).sex

 

Поскольку указатели часто используются для указания на структуры, в языке Си специально для ссылок на компоненты таких структур введен оператор выбора стрелка вправо ->. Например, ссылки на вышеприведенные компоненты структуры можно записать с использованием оператора стрелки вправо -> как:

 

new_struct->name

 

new_struct->id

 

new_struct->age

 

new_struct->sex

^ Массив структур

 

Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива:

 

struct book libry[MAXBKS];

 

Этот оператор объявляет libry массивом, состоящим из MAXBKS-элементов. Каждый элемент массива представляет собой структуру типа book. Таким образом, libry[0] является book-структурой, libry[1] - второй book-структурой и т.д.

 

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

 

libry[0].value value - первый элемент массива

 

libry[4].title title - пятый элемент массива