Формат определения структуры:
Структуры представляют собой группы связанных между собой, как правило, разнотипных переменных, объединенных в единый объект, в отличие от массива, все элементы которого однотипны. В языке C++ структура является видом класса и обладает всеми его свойствами.
Для определения структуры применяется ключевое слово struct, а сам формат определения выглядит следующим образом:
struct [имя_типа] {
тип_1 элемент_1; тип _2 элемент_2; …
тип_k элемент_k; } [ список_описателей ];
Каждая входящая в структуру переменная называется членом (полем, элементом) структуры и описывается типом данных и именем. Поля структуры могут быть любого типа данных. Их количество не лимитировано.
Использование структур:
После определения структуры можно её использовать. Для начала можно определить объект структуры - по сути обычную переменную, которая будет представлять описанную ранее структуру.
struct Student Ivan;
Здесь определена переменная Ivan, которая представляет структуру Student.
При описании структуры память для размещения данных не выделяется. Работать с описанной структурой можно только после того, как будет определена переменная (переменные) этого типа данных, только при этом компилятор выделит необходимую память.
Еще один способ определения структуры представляет ключевое слово typedef:
typedef struct
{ int age;
char name[10];
} person;
В конце определения структуры после закрывающей фигурной скобки идет ее обозначение - в данном случае person. В дальнейшем можно использовать это обозначение для создания переменной структуры.
person tom = {23, "Tom"};
В языке С++ отличие от С при определении переменной не нужно использовать слово struct.
Инициализация структур:
Инициализация структур аналогична инициализации массивов: в фигурных скобках передаются значения для элементов структуры по порядку. Так как в структуре student первым определено свойство, которое представляет тип int - число, то в фигурных скобках вначале идет число. И так далее для всех элементов структуры по порядку.
При определении переменной структуры ее можно сразу инициализировать, присвоив какое-нибудь значение:
struct student Ivan = {23, "Ivan", 0393};
Инициализировать структуру можно сразу после её объявления. Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
struct complex{
float real, im;
} data [2][2] = {
{{1,1}, {2,2}}, {{3,3}, {4,4}} };
Все поля структурных переменных располагаются в непрерывной области памяти одно за другим. Общий объем памяти, занимаемый структурой, равен сумме размеров всех полей структуры. Для определения размера структуры следует использовать инструкцию sizeof().
Структуры как элемент структур:
Кроме базовых примитивных типов данных как int или char, массивов и указателей в качестве элементов структуры можно использовать другие структуры.
struct Pizza
{
char name[20];
int price;
};
struct Client
{
char name[20];
char phone[20];
};
struct Order
{
struct Client client;
int count;
struct Pizza pizza;
};
Использованные здесь структуры отражают объекты реального мира. Структура Order представляет некоторого клиента, его элементы client, count и pizza представляют клиента-заказчика (структура client), количество заданных пицц и заказанную пиццу (структура pizza) соответственно. Структура Pizza представляет собой пиццу, в которой определено три элемента: name - название, price - стоимость. Структура Client содержит информацию о клиенте-заказчике, его имя name и номер телефона phone.
Таким образом, получается, что структура Order имеет три элемента, но так клиент и пицца - составные элементы и сами содержат по два элемента, то при инициализации структуры order нужно передать 5 параметров:
Order order_1 = {"Ivan", "+7 (111) 272-65-52", 2, "Hawaiian", 280};
Передача значений таким образом идет в том порядке, в котором элементы определены в структуре, в том числе во вложенных структурах.
Массивы структур:
В программировании очень часто используются такие конструкции, как массивы структур. Все форматы определения массива структур будут аналогичны определению массивов других типов:
struct Students students[30];
Был определен 30-элементный массив, каждый элемент которого предназначен для хранения данных одного студента. Получение доступа к данным некоторого студента из группы N осуществляется обычной индексацией переменной массива. Поскольку поля структуры могут быть любого типа данных, то они в свою очередь могут быть другой структурой или массивом других структур:
struct Stud
{
char FN[100];
short listNumber;
};
struct Group {
int groupNumber;
short students;
Stud stud[30];
};
Но в структуре поля нельзя использовать элемент, тип которого совпадает с типом самой структуры, так как рекурсивное использование структур запрещено.
Ещё один пример использования массива структур:
struct person
{ int age;
char name[20];
};
int main(void)
{
struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
return 0;
}
В массиве people определено 4 объекта person. Хотя при инициализации в массив передается 8 значений {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"}, но так как каждая структура состоит из двух элементов, то соответственно из этих значений по порядку получается 4 объекта person.
Доступ к полям структур:
Для того чтобы записать данные в структурную переменную, необходимо каждому полю структуры присвоить определенное значение. Для этого необходимо использовать оператор ‘.’ («точка»):
struct Stack { // Cтек float arr[100];
short topIndex;
};
…
Stack stack; // Объявляем переменную типа Stack Stack.arr[0] = 1;
…
При доступе к определенному полю его следует рассматривать как обычную переменную, тип данных которой соответствует типу этого поля. Поля структур могут участвовать в качестве операндов любых выражений, допускающих использование операндов соответствующего типа данных.
Копирование данных из одной структурной переменной в другую осуществляется простой операцией присваивания, независимо от количества полей и размера структуры (это можно делать только в том случае, когда обе переменные одного и того же типа).
struct company
{ char name[20];
char country[30];
};
struct smartphone
{ char title[20];
int price;
struct company manufacturer; };
int main(void)
{
struct smartphone phone = {"iPhone 8", 56000, "Apple", "USA"};
std::cout << phone.title;
std::cout << phone.price;
std::cout << phone.manufacturer.name;
return 0;
}