Структуры, объединения, перечисления 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Структуры, объединения, перечисления



Все данные, с которыми работает программа можно разделить на две группы:

· простые;

· структурированные.

Из рассмотренных ранее типов данных к структурированным типам относятся массивы, остальные типы данных – простые – не имеющие внутренней структуры.

Структуры и объединения относятся к структурированным (конгломератным) типам данных, определяемых программистом.

Структуры

Определение структур

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

Для работы с некоторой структурой в программе необходимо:

1. описать тип данных этой структуры;

2. определить переменные этого типа для хранения соответствующих данных в памяти.

Рассмотрим пример: сведения о студенте содержат следующие данные:

· фамилия - Fam;

· имя - Name;

· год рождения - Year;

· пол - Sex;

· средний балл - Grade.

Представим все эти данные в виде единой структуры. Введем новый тип данных (назовем его t_ Student)  для описания этой структуры:

 

struct t_Student {

char Fam [20],

         Name [16];

short Year;

bool Sex;

float Grade;

};

Описание структуры начинается ключевым словом struct. Каждая входящая в структуру переменная называется членом (полем, элементом) структуры и описывается типом данных и именем. Поля структуры могут быть любого типа данных. Их количество не лимитировано.

Вся эта конструкция является инструкцией языка программирования, поэтому после нее всегда должен ставиться символ;.

При описании структуры память для размещения данных не выделяется. Работать с описанной структурой можно только после того, как будет определена переменная (переменные) этого типа данных, только при этом компилятор выделит необходимую память:

 

t_ Student St1, St2; // Определены две переменные типа t_Student 

 

Определение переменных можно осуществить одновременно с описанием типа данных структуры:

 

struct  t_Student {

char Fam [20],

         Name [16];

short Year;

bool Sex;

float Grade;

} St1, St2;

 

Все поля структурных переменных располагаются в непрерывной области памяти одно за другим. Общий объем памяти, занимаемый структурой, равен сумме размеров всех полей структуры. Для определения размера структуры следует использовать инструкцию sizeof (): sizeof (t_ Student)  или sizeof (St2).

Доступ к полям структур

Для того чтобы записать данные в структурную переменную, необходимо каждому полю структуры присвоить определенное значение. Для этого необходимо научиться получать доступ к полям. Для этого используется оператор “точка”. Например:

 

strcpy (St1.Fam, “Иванов ”);

strcpy (St1.Name, “Владимир ”);

St1.Year = 1995;

St1. Sex = true; // Надо договориться какое значение соответствует значению пола

St1. Grade = 4.67;

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

Копирование данных из одной структурной переменной в другую осуществляется простой операцией присваивания не зависимо от количества полей и размера структуры (это можно делать только в том случае, когда обе переменные одного и того же типа):

 

St2 = St1;

Теперь переменная St2 содержит те же данные, что и переменная St1.

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

 

t_ Student Gruppa [25];

Здесь мы определили 25-ти элементный массив, каждый элемент которого предназначен для хранения данных одного студента. Получение доступа к данным некоторого студента из группы осуществляется обычной индексацией переменной массива:

 

St1 = Gruppa [10]; // Переменная St1 содержит сведения об 11-ом студенте

 

Доступ к некоторому полю студента внутри массива делается так:

 

double grade = Gruppa[10].Grade; // Переменная grade содержит среднюю оценку 11-ого студента

 

Если некоторое поле структуры представляет собой массив (например, поле Fam – это массив символов), доступ к отдельному элементу этого массива можно выполнить так:

 

St1. Fam[5] = ‘ш’;

 

Или так:

 

Gruppa[10]. Fam[5] = ‘ш’;

 

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

Определяем новый тип данных и переменные для двух групп:

 

struct t_Gruppa {

short NumGr;                  // Номер группы

short Count;                          // Количество студентов в группе

t_ Student Students[25];    // Массив студентов группы

} Gr1372, St1373;

 

Получим данные о некотором студенте из группы Gr1372:

 

St1 = Gr1372. Students[10];         // Переменная St1 содержит сведения об 11-ом студенте

 

А вот его средний балл:

 

grade = Gr1372. Students[10]. Grade;

В структуре в качестве поля нельзя использовать элемент, тип которого совпадает с типом самой структуры (рекурсивное использование структур запрещено).

Указатели на структуры

Любая структурная переменная занимает в памяти определенное положение, характеризующееся конкретным адресом. Для работы с адресами структурных переменных (как и для простых переменных) можно использовать указатели. Указатели на структурные переменные определяются точно так же, как и для обычных переменных:

 

t_ Student * p_ Stud; // Переменная p_ Stud указатель на тип данных t_ Student

p_ Stud = & St1;     // Переменной p_ Stud присвоен адрес переменной St1

 

Разыменование указателя (обращение к данным по адресу, хранящемуся в указателе) осуществляется обычным образом:

 

St2 = * p_ Stud;      // Данные по адресу p_ Stud скопированы в переменную St2

Через указатели можно работать с отдельными полями структур. Для доступа к полю структуры через указатель используется оператор “стрелка”, а не “точка”:

 

grade = St1.Grade;  // Доступ к полю Grade через обычную структурную переменную с помощью оператора “точка”

grade = p_Stud -> Grade;  // Доступ к полю Grade через указатель на структурную переменную с помощью оператора “ стрелка”

p_ Stud -> Grade = 3.75; // Полю Grade через указатель на структурную переменную присвоено новое значение



Поделиться:


Последнее изменение этой страницы: 2021-09-26; просмотров: 53; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.65.65 (0.013 с.)