Структуры данных
В языках C и C++ есть способ логически объединить данные, для этого используются
Структуры в языке C
Структуры и классы в языке C++
Между ними есть различия, и в языке C++ структуры похожи на классы и в них можно добавить методы,
также у класса все поля по умолчанию private и наследование по умолчанию private, а у структуры public,
поэтому рассмотрим простейшие структуры, которые используются для логического объединения данных (это одинаково в C и C++)
Структуры – это своего рода шаблоны/описания что «эти данные» стоит рассматривать вместе, и для этих шаблонов можно создавать экземпляры.
Проведем аналогию с переменной – есть шаблон переменной например int, а мы используем экземпляр/тип этой переменной и пишем int a=5;
Общий синтаксис структуры представлен ниже
struct имя_структуры
{
компонент_структуры_1;
//...
компонент_структуры_N;
};
Также структура может содержать внутри себя другие структуры:
Создадим структуру человек (person)
struct person
{
unsigned int age;
unsigned char Name[255]; //255 произвольное значение, позволяющее вместить имя и используется просто для примера
};
Внутри структуры мы определили поля возраста и массива для имени.
Сейчас мы только создали структуру. Создадим ее экземпляр, объект.
person Person_1; //создаем экземпляр структуры с именем Person_1
Структура Person_1 имеет внутри поля age и Name[255], но сейчас эти поля пустые. Необходимо их проинициализировать, для обращения к полям структуры как правило используется оператор точка.
Person_1.age=30;
Person_1.Name[0]='V'; //"Vasya";
Person_1.Name[1]='a';
Person_1.Name[2]='s';
Person_1.Name[3]='y';
Person_1.Name[4]='a';
Person_1.Name[5]='\0';
Создадим экземпляр структуры для 2 человека
person Person_2; //создаем экземпляр структуры с именем Person_2
char NameBuf[]={"Petya"};
Person_2.age=20;
for(int i=0;i<6;i++) Person_2.Name[i]=NameBuf[i];
//Выведем на консоль (язык c++)
cout<< Person_1.Name<<” возраст ”<< Person_1.age<<endl; //просто вывод на консоль
cout<< Person_2.Name<<” возраст ”<< Person_2.age<<endl; //просто вывод на консоль
Можно инициализировать и создавать экземпляры структуры сразу
struct Person
{
unsigned int age;
unsigned char Name[255];
} Person_3{10,"Jenya"};
cout<< Person_3.Name <<endl; //просто вывод на консоль
Также допустимым является синтаксис:
person Person_4={15, "Anya"}; //создаем экземпляр структуры с именем Person_4
Примечание: имена писал транслитом чтобы не загромождать объяснением как включить русскую раскладку в вашей IDE (обычно вызывается функция типа setlocale) и в принципе вывод сделанный на языке c++ не обязателен, просто показывает пример обращения к данным.
Выравнивание:
Также стоит оговориться, что компилятор может проводить выравнивание структуры (дополнять ее для достижения удобных компилятору и вычислению границ)
Например структуру в 3 Байта может расширить до 4Байт (на 32 разрядной машине)
Если в структуре разные типы данных, например short, int, double, то он может сделть выравнивание до 8байт.
Для отмены выравниваний используется ключевое слово #pragma pack