Структуры. Операции над структурами
Структуры объединяют под одним именем несколько переменных, возможно разных типов.
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;
Поскольку указатель на структуру используется часто то для доступа к её элементам существует ещё один способ – операция стрелка “->”.Операция ‘->’ и ‘.’ имеют одинаковый приоретет и вместе с операциями () и [] имеют наивысший приоритет.
Для доступа к структурам, размещенных динамич образом, для передачи в функции используют указатели.