Определение структурных переменных. Доступ к компонентам структуры.

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

 

struct имя_структуры {

 

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

 

};

 

Пример:

 

struct dinner {

 

char *plase;

 

float cost;

 

struct dinner *next;

 

};

 

Структурная переменная описывается с помощью переменной структурного типа.

 

Примеры:

 

struct dinner week_days [7]; /* массив структур */

 

struct dinner best_one; /* одна структурная переменная */

 

struct dinner *p; /* указатель на структурную переменную */

 

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

 

struct{

 

список описаний

 

}

 

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

 

тип-данных описатели;

 

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

 

struct {

 

double x,y;

 

} a,b,c[9];

 

переменные a и b определяются как структуры, каждая из которых состоит из двух компонентов - x и y. Переменная с определяется как массив из девяти таких структур.

 

Из определения

 

struct {

 

int year;

 

short int month, day;

 

} date1,date2;

 

следует, что каждая из двух переменных date1, date2 состоит из трех компонентов: year, month, day.

 

С типом структуры может быть ассоциировано имя, которое задается описанием типа в форме

 

typedef struct {

 

список описаний

 

} имя-типа-структуры;

 

Функция typedef позволяет нам создать свое собственное имя типа. Это напоминает директиву #define, но со следующими тремя изменениями:

 

В отличие от #define функция typedef дает символические имена, но ограничивается только типами данных.

 

Функция typedef выполняется компилятором, а не препроцессором.

 

В своих пределах функция typedef более гибка, чем #define.

 

В дальнейшем эти имена могут использоваться для определения структур. Ниже приведен пример описания типа структуры с именем employee:

 

typedef struct {

 

char name[30];

 

int id;

 

dept d;

 

family f;

 

} employee;

 

где слова dept, family указывают типы, а именно типы структур, предварительно определенные пользователем. Тип структуры employee может быть использован для определения переменных. Например, определение

 

employee chaiperson, president, eq, e2;

 

описывает переменные chairperson, president, e1, e2 как структуры типа employee.

 

Существует и другой способ ассоциирования имени с типом структуры. Этот способ основан на применении меток структуры. Метки структуры аналогичны меткам перечисляемого типа. Метка структуры описывается следующим образом:

 

struct метка{

 

список описаний

 

}

 

где метка является идентификатором. В приведенном ниже примере слово student описывается как метка структуры:

 

struct student {

 

char name[25]

 

int id,age;

 

char sex;

 

};

 

^ Метки структуры используются для определения структур записью вида

 

struct метка список-идентификаторов;

 

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

 

struct node {

 

int data;

 

struct node *next;

 

};

 

метка структуры node действительно является рекурсивной, так как она используется в своем собственном описании, т.е. в описании указателя next. Из-за наличия знака * переменная next описана как указатель на объекты типа node. Структуры не могут быть прямо рекурсивными. Структура типа S не может содержать компонент, являющийся структурой типа S. Однако структура типа S может содержать компонент, указывающий на структуру типа S.

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

 

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

 

s.c

 

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

 

date1.year

 

date1.month

 

date1.day

^