Структуры (struct)
.pdfvk.com/club152685050
Структуры
Структура является совокупностью элементов произвольных типов, в отличие от
массивов, который поддерживает элементы одного типа. struct [ имя_типа ] {
тип_1 элемент_1; тип_2 элемент_2;
...
тип_n элемент_n;
} [ список описателей ];
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
Пример. Определение массива структур и указателя на структуру: struct {
char fio[30]; int date, code; double salary;
} staff[100], *ps;
Описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами. Например, в следующем примере определяется новый тип, называемый address, который задает почтовый адрес:
struct address { |
// имя |
char* name; |
|
long number; |
// номер дома |
char* street; |
// улица |
char* town; |
// город |
}; |
|
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках
в порядке их описания
//Объявление переменной типа address и инициализация address addr1={"Ivanov", 174, "Nevsky pr.", "SPb"};
Доступ к полям структуры выполняется с помощью операций выбора . (точка) при
обращении к полю через имя структуры и -> при обращении через указатель, например: address m[10];
address * pa=new address; addr1.name="Petrov"; m[0].name=" Kibzun"; pa->number=123;
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование.
address addr2; addr2=addr1;
Два структурных типа считаются различными даже тогда, когда они имеют одни и те же
члены. Например, ниже определены различные типы: struct s1 { int a; };
struct s2 { int a; };
В результате имеем:
s1 |
x; |
// ошибка: несоответствие типов |
s2 |
y = x; |
Кроме того, структурные типы отличаются от основных типов, поэтому получим:
s1 x; |
= x; |
// ошибка: несоответствие типов |
int i |
vk.com/club152685050
Структуру можно передавать в функцию в качестве параметра и возвращать в качестве
значения функции. void show(address a)
{cout<<"Имя: "<<a.name<<endl; cout<<"Номер дома: "<<a.number<<endl; cout<<"Улица: "<<a.street<<endl;
cout<<"Город: "<<a.town<<endl;
}
Вызов функции: show(addr1);
Имя типа становится доступным сразу после его описания. Таким образом можно в
описаниях типов полей структуры использовать имя типа самой структуры. struct list{
list* next; list* prev;
};
// ошибка - Элементы структуры могут иметь любой тип, кроме типа этой же структуры struct some_type{
some_type a;
}
Возможны ссылки двух и более структур друг на друга. Для того чтобы структура могла
быть использована в другой структуре, она должна быть заранее объявлена. struct list1;
struct list2{ list1* next; list1* prev;
};
struct list1{ list2* head;
};