4.1. Структуры - StriderAJR/StudentCpp GitHub Wiki

Структуры

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

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

Например, в геометрии это точка.

У точки на плоскости 2 координаты, в пространстве вообще три. Т.е. для каждой такой точки нужно создавать 2 переменных:

struct Point
{
     int x, y;
};

Не забывайте ; после описания структуры! Иначе компилятор не поймет, что описание структуры закончилось и у вас посыпятся ошибки компилятора о неправильной вложенности. Т.е. создавая какую-то структуру, (например, мы создали структуру Point - точка), мы создали свой собственный тип данных, такой же как int, char, double и т.д.

Отличие от стандартных типов данных (например, типа int) только в том, что int - простой тип данных и переменная такого типа хранит только одно целочисленное число, а переменная типа данных точка будет хранить сразу 2 переменных типа данных int.

В памяти структура хранится одним большим блоком, как сумма блоков каждой отдельной переменной внутри структуры. Под каждую переменную типа данных Point будет выделяться 8 байт памяти: 4 байта для переменной x + 4 байта для переменной y. И в памяти лежать эти данные будут друг за другом подряд.

Наглядный пример

Структура - это тип данных! Значит, можно создавать переменные такого типа.

Создадим еще одну структуру, треугольник:

Треугольник характеризуется 3 вершинами.

struct Triangle
{
     Point v1, v2, v3;
};

Таким образом у треугольника будет 3 вершины, каждая из которых - это точка с 2-мя координатами x и y.

Вся логика должна быть понятна, проста и легко читаема постороннему человек, который в первый раз открыл ваш код. Иначе вы что-то делаете не так.

Корень проблемы данной ситуации, что для описании одного понятия "точка" требуется 2 переменных, а для понятия "треугольник" - 3 точки.

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

Структура - это несколько переменных, объединенных под одним именем.

Ну а теперь рассмотрим как же работать со структурами:

void main()
{
     Point p1;
     Point* p2 = new Point;

     p1.x = 1;
     p1.y = 2;

     p2->x = 3;
     (*p2).y = 4; // Это аналогичная запись 
    
     cout << p2->x << endl; // 3
     cout << (*p2).x << endl; // 3

     Triangle t;
       
     t.v1.x = 2; 
     t.v1.y = 3;
     t.v2.x = 1;
     t.v2.y = 10;
     t.v3.x = 4;
     t.v3.y = -2;     
}

Статическое создание переменной типа структура:

Point p1;

Динамическое создание переменной типа структура:

Point* p2 = new Point;

Оператор . - получение доступа к внутреннему содержимому переменной составного типы.

Оператор -> - то же, что и ., но применяется, если переменная состоавного типа - это указатель.

Ещё оператор -> - более компактная запись 2-х операций:

1. разыменовывания указателя 
2. получения доступа до составного типа

Следующие 2 строчки делают одно и то же, но с помощью разных операторов . и ->

cout << p2->x << endl; // 3
cout << (*p2).x << endl; // 3

Создадим треугольник:

Triangle t;

Заполним значения вершин:

Внутри переменной t есть переменная v1, а внутри v1 есть переменные x и y. Это как коробка внутри коробки. Есть большая коробка t - треугольник, внутри которой есть 3 другие коробки v1, v2, v3, внутри каждой из которых лежит 2 целочисленные переменные x и y.

⚠️ **GitHub.com Fallback** ⚠️