Тема: Структурные типы и структуры

(4 часа)

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

Структуры

Структуры конструируются следующим образом:

struct имя_структурного_типа{

определения_элементов

}; // символ «точка с запятой (;)» обязателен!

Например:

struct film{

char name[20];

char rej[20];

char counry[20];

unsigned int price;

};

Здесь struct – спецификатор структурного типа (служебное слово); film – имя структурного типа (определяется пользователем); в фигурных скобках размещаются описания элементов, которые будут входить в каждый объект типа film.

имя_структурного_типа – идентификатор, произвольно выбираемый программистом;

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

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

struct film x, y, z;

или

film x, y, z;

Описание указателя на структуры такого типа выглядит следующим образом:

struct film *pointer;

или

film *pointer;

Допускается определение структур одновременно с определением структурного типа:

struct { double x,y; } s1, s2, sm[9]; struct { int year; char moth, day; } date1, date2;

Переменные s1, s2 определяются как структуры, каждая из которых состоит из двух компонент х и у. Переменная sm определяется как массив из девяти структур. Каждая из двух переменных date1, date2 состоит из трех компонентов year, moth, day.

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

typedef struct{определения_элементов}

обозначение_структурного_типа

Пример:

typedef struct{

float x;

float y;

float z;

float r;

} sphere;

sphere a, b;

Использование идентификаторов структуры необходимо для описания рекурсивных структур. Ниже рассматривается использование рекурсивных идентификаторов структуры.

struct node { int data; struct node * next; }st1_node;

Идентификатор структуры node действительно является рекурсивным, так как он используется в своем собственном описании, т.е. в формализации указателя next. Структуры не могут быть прямо рекурсивными, т.е. структура node не может содержать компоненту, являющуюся структурой node, но любая структура может иметь компоненту, являющуюся указателем на свой тип, как и сделано в приведенном примере.

Доступ к компонентам структуры осуществляется с помощью указания имени структуры и следующего через точку имени выделенного компонента, например, для структуры film:

x.name=”Титаник”;

x.rej=”Кто-то”;

x.counry=”Какая-то”;

x.price=100000; Конструкция имя_структуры.имя_элемента называется уточненным именем.Если переменная x определена как указатель на структуру, то для доступа к полям структуры следует использовать операцию “->”. Оператор x->name эквивалентен выражению (*x).name.Инициализацию структуры можно выполнить непосредственно в определении конкретной структуры после ее имени и знака «=» в фигурных скобках:struct film f1={“Фильм1”, “режиссер1”, “Страна1”, 222222};Стандарт языка С допускает присваивание структур: x=film1;Для структур не определены операции сравнения, допускается сравнение по элементам.Выделение памяти для структурОпределение структурного типа не связано с выделением памяти, а при определении объекта структурного типа ему выделяется память в таком количестве, чтобы могли разместиться данные всех элементов. Реальный размер памяти в байтах, выделяемый для структуры, можно определить с помощью операцииsizeof(имя_структуры)sizeof(имя_структурного_типа)

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

Определяются массивы структур так же, как и массивы других типов данных. Единственное отличие – служебное слово struct в названии структурного типа (если обозначение структурного типа не введено с помощью typedef), например:

struct film a[100];

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

Указатели на структуры определяются, как и указатели на другие типы данных: struct film *ptr;

Указатели могут вводиться и для безымянных структурных типов:

struct{

/*поля структуры*/

}*ptr1, ptr2;