- •2.1. Структуры
- •2.1.1. Определение структурных переменных
- •2.1.2. Доступ к компонентам структуры
- •2.1.3. Поля битов в структурах
- •2.2. Объединения
- •2.3. Перечисления
- •2.4. Переменные структуры
- •2.5. Указатели и структуры
- •2.6. Массив структур
- •2.7. Переименование типов
- •3. Методические указания
- •4. Порядок выполнения работы
- •5. Варианты заданий
2.4. Переменные структуры
В языках, таких как Ада и Паскаль, имеется тип данных, называемых переменная запись, объекты которой содержат набор одних и тех же компонентов плюс компоненты, не являющиеся общими для всех остальных объектов. В языке Си также имеется тип данных, подобный переменной записи, называемой переменной структурой, которая может быть реализована с использованием комбинации структуры и объединения. В общем случае переменные структуры будут состоять из трех частей: набора общих компонентов, метки активного компонента и части с меняющимися компонентами. Общая форма переменной структуры имеет следующий вид:
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
health_record.ms
health_record.marital_info.marriage_date
2.5. Указатели и структуры
Рассмотрим метку структуры 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_student->name
new_student->id
new_student->age
new_student->sex
2.6. Массив структур
Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива:
struct book libry[MAXBKS];
Этот оператор объявляет libry массивом, состоящим из MAXBKS-элементов. Каждый элемент массива представляет собой структуру типа book. Таким образом, libry[0] является book-структурой, libry[1] - второй book-структурой и т.д.
Определение элементов массива структур. При определении элементов массива структур мы применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и имени элемента:
libry[0].value value - первый элемент массива
libry[4].title title - пятый элемент массива