В языке Си, структура (struct) — композитный тип данных, инкапсулирующий без сокрытия набор значений[en] различных типов. Порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через указатели)
Пример объявления структуры:
struct str_name
{
int member_1;
float member_2;
char member_3[256];
/* ... */
};
// объявление структуры
struct str_name struct0;
// объявление и инициализация структуры
struct str_name struct1 = {1, 3.1416f, "doit" /* ... */};
// объявление структуры и поимённая инициализация полей
// поддерживается стандартом начиная с C99
struct str_name struct3 = {.member_1=2, .member_2=3.1416f, .member_3="doit" /* ... */};
Тип «структура» в Си уникален в своём роде тем, что допускает рекурсию, то есть наличие в своём составе указателей, ссылающихся на объекты этой самой структуры. Таким образом, структуры в Си объединяют в себе функциональность не только кортежей и записей, но и алгебраических типов.
В C++ понятие структуры было расширено до класса, то есть была добавлена возможность включения в структуру функций-методов. Главное отличие состоит в том, что в соответствии с «правилом трёх» структуры всегда имеют конструктор, даже если явное его определение в исходном коде отсутствует. Таким образом, говорить о «структурах в С++» некорректно. То же относится к C#.
Объявление структуры
Структура — это агрегатный тип данных, так как может содержать в себе разнотипные элементы. Синтаксис объявления структуры в С++ отличается от C. Хотя версия C остается правильной для C++. Получается, что в С++ можно двумя стилями объявления структур пользоваться, а в языке C — только одной. Смотрим синтаксис объявления структуры в языке С++:
struct Name
{
type atrib;
// остальные элементы структуры
} structVar1, structVar2, ...;
где,
struct — ключевое слово, которое начинает определение структуры
Name — имя структуры
type — тип данных элемента структуры
atrib — элемент структуры
structVar1-2 — структурные переменные
Объявление структуры всегда должно начинаться с ключевого слова struct. Необязательно, чтобы структура имела имя, но тогда такая структура обязательно должна иметь структурные переменные, объявленные между закрывающей фигурной скобкой и точкой с запятой, строка 5. Обязательно в объявлении структуры должны присутствовать фигурные скобочки, они обрамляют тело структуры, в котором объявляются её атрибуты (элементы), строка 3. Структурные переменные, при объявлении структуры, указывать необязательно, строка 5.
Так как структура это тип данных, то, для того, чтобы использовать этот тип данных, необходимо объявить структурную переменную, а вместо типа данных указать имя структуры.
struct_name structVariable;
Синтаксис объявления структуры в языке Си:
typedef struct name
{
type atrib1;
type atrib2;
// остальные элементы структуры...
} newStructName structVar;
Синтаксис объявления структуры в языке Си предполагает два варианта. Первый, опустить ключевое слово typedef , при этом имя newStructName тоже не используется, и имя структуры, тогда обязательно необходимо при объявлении структуры использовать структурные переменные — structVar, строка 6. Смотрим пример:
struct name structVar;
Или вы можете воспользоваться typedef, для объявления псевдонима структуры newStructName, псевдоним:
newStructName structVar;
В любом случае, если вы хотите, объявить указатель на структуру внутри структуры, вы должны использовать первый синтаксис:
struct name *struct_instance; // указатель на структуру
Объявление указателя на структуру
Синтаксис объявления указателя на структуру в Си неоднозначен. В Си, если вы не используете typedef при определении структуры, то, в обязательном порядке необходимо использовать структурные переменные, между закрывающейся фигурной скобочкой и точкой с запятой.
В C++, этого не требуется. Чтобы объявить указатель на структуру, в С++ вы просто перед именем структурной переменной ставите символ указателя — *.
В С++:
structName *structVar; // указатель на структуру structName
В Си:
newStructName *structVar; // newStructName должно быть объявлено с typedef
или так, тоже для СИ:
struct name *structVar;