16. C/C++ Структуры данных

Структуры данных

В языках 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *