Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Структуры (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;

 

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


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал