Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Структуры (struct)
Структура – это объединенное в единое целое множество поименованных элементов в общем случае разных типов. В отличие от массива, все элементы которого однотипны, структура может содержать элементы разных типов. Каждая структура включает в себя один или несколько объектов (переменных, массивов, указателей, структур и т. д.), называемых элементами структуры (компонентами). Элементы структуры также называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Структуры, так же, как и массивы относятся к структурированным типам данных. Они отличаются от массивов тем, что, во-первых, к элементам структуры необходимо обращаться по имени, во-вторых, все поля структуры необязательно должны принадлежать одному типу.
struct [ имя_типа ] { тип_1 элемент_1; тип_2 элемент_2; ... тип_n злемент_n; } [ список_описателей ];
Такое определение вводит новый производный тип, который называется структурным типом. Если список описателей отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами Например:
struct Worker{ // описание нового типа Worker char fio[30]; int age, code; double salary; }; // описание заканчивается точкой с запятой
// определение переменной, массива типа Worker и указателя на тип Worker Worker y, staff[100], *ps;
Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка.
// Определение переменной, массива структур и указателя на структуру struct { char fio[30]; int age, code; double salary; } x, staff[100], *ps;
Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в тех случаях, когда компилятору не требуется знать размер структуры.
struct List; // объявление структуры List struct Link { List *р; // указатель на структуру List Link *prev, *succ; // указатели на структуру Link }
struct List { /* определение структуры List */};
Это позволяет создавать связные списки структур. Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания.
struct Worker { char fio[30]; int age, code; double salary; };
Worker ivanov = {" Иванов И.И.", 31, 215, 5800.35};
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива.
struct complex { float re, im; } compl [3] = { {1.3, 5.2}, {3.0, 1.5}, {1.5, 4.1}};
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Но присваивание – это и все, что можно делать со структурами целиком. Другие операции, например сравнение на равенство или вывод, не определены. Структуру можно передавать в функцию и возвращать в качестве значения функции. Размер структуры не обязательно равен сумме размеров ее элементов, поскольку они могут быть выровнены по границам слова. Доступ к полям структуры выполняется с помощью операций выбора. (точка) при обращении к полю через имя структуры и –> при обращении через указатель. Ввод/вывод структур, как и массивов, выполняется поэлементно.
Worker worker, staff[100], *ps;
worker.fio = " Петров С.С."; staff[3] = worker; staff[8].code = 123; ps-> salary = 4350.00;
Переменные структурного типа можно размещать и в динамической области памяти, для этого надо описать указатель на структуру и выделить под нее место
Worker *ps = new Worker; //создает переменную структурного типа Worker *pms = new Worker[5]; //создает массив структурного типа
//обращение через операцию косвенного доступа ps-> age = 55; //обращение через разыменовывание указателя (*ps).code = 253;
//обращение к 0 элементу созданного массива через индекс pms[0].salary = 5800;
//обращение к 1 элементу созданного массива через указатель (*(pms + 1)).salary = 4800;
//очистка занимаемой памяти delete ps; delete []pms;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора.
struct А { int а; double х; };
struct В { А а; double х; };
B x[2];
х[0].а.а = 1; х[0].а.x = 35.15; х[1].х = 0.1;
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости.
|