Структуры. Операции над структурами

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

1.struct [имя типа структуры]{список элем структуры}[описатель [,описатель]]…;

2.struct имя типа структуры описатель[,описатель]…;

Объявление структуры задаёт имена переменных структуры и последовательность переменных величин, называемых элементами структуры( членами структуры или полями структуры).Причем каждое поле может иметь свой тип.

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

В формате 2 используется имя типа структуры, которое уже было определено где-то раньше в программе.

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

Описатель именует переменную типа struct и может быть обычной перем, указателем, массивом или ф-цией.

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

struct student {char name[30];

int kurs;

char group [8];}

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

struct a{char c;int b;} l; - 4 байта

Задание шаблона и объявление переменной можно производить одновременно.

Доступ к элементу структуры осуществляется с помощью операции точка: имя_структуры . имя_переменной

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

struct pt{int x; int y;};

struct a{struct pt,p1; struct p1,p2;}

Ссылка на поле вложенной структуры формируется из имени структуры переменной, имени структурного поля и имени поля вложенной структуры: screen.p1.x

Ограничение на вложение структур: структура не может вкладываться сама в себя.

Операции над структурами

Возможны следующие операции над структурами:

1.Копирование

2.Присваивание (передача структур в функции и возврат их в качестве результата также относится к операции присваивания)

3.Взятие адреса

4.Осущ доступа к переменной

Структуры. Операции над структурами

Структуры нельзя сравнивать. Если объявлены две структ перем с одним шаблоном, то можно написать stud1=stud2; если они имеют один тип. Нельзя использовать операцию присваивания для структур, шаблоны которых под разным, хотя и идентичными, именами.

ПР: main()

{struct first{int a;

char b;};

struct second{int a;

char b;};

struct first a;

struct second b;

a.a=1,a.b=’f’;

b.a = a.a;

b.b = a.b

}

Шаблон имеет область видимости. Если шаблон объявлен внутри блока – локальный шаблон. Если шаблон объявлен вне блока, то он видим во всех ф-циях от точки объявления до конца файла. Нельзя описывать шаблон с реквизитом extern.

Переменная типа структуры также может быть локальной, глобальной и формальным параметром ф-ции.

При использовании структурных переменных в качестве параметров ф-ций используют 3 подхода:

1.Передавать элементы структурных переменных по отдельности

2.Передавать структуру целиком

3.Передавать указатель на структуру

Если передаётся структура по значению, то все элементы структуры заносятся в стек. Если структура большая, то стек может переполниться. При передаче по ссылке вся структура не копируется, а в стек заносится только адрес структуры. Можно объявить указатель на структуру: struct student *p;

Поскольку указатель на структуру используется часто то для доступа к её элементам существует ещё один способ – операция стрелка “->”.Операция ‘->’ и ‘.’ имеют одинаковый приоретет и вместе с операциями () и [] имеют наивысший приоритет.

Для доступа к структурам, размещенных динамич образом, для передачи в функции используют указатели.

Наши рекомендации