Введение

Структурированный тип в языке программирования C

Структура в языке программирования C (и многих его производных) — это композитный тип данных (или запись), определяющий физически сгруппированный список переменных под одним именем в блоке памяти, позволяя обращаться к различным переменным через единый указатель или по имени объявленной структуры, которое возвращает тот же адрес. Тип данных struct может содержать другие типы данных, поэтому он используется для записей со смешанными типами данных, таких как запись каталога жесткого диска (длина файла, имя, расширение, физический адрес и т. д.) или другие записи со смешанными типами (имя, адрес, телефон, баланс и т. д.). Структура C напрямую ссылается на непрерывный блок физической памяти, обычно ограниченный границами длины слова. Она соответствует аналогичной функции, доступной в некоторых ассемблерах для процессоров Intel. Поскольку структура представляет собой блок непрерывной памяти, каждое поле внутри неё находится на определенном фиксированном смещении от начала. Так как содержимое структуры хранится в непрерывной памяти, оператор `sizeof` необходимо использовать для получения количества байтов, требуемых для хранения конкретного типа структуры, как и для примитивных типов данных. Выравнивание отдельных полей в структуре (относительно границ слов) зависит от реализации и может включать в себя добавление отступов, хотя современные компиляторы обычно поддерживают директиву `#pragma pack`, которая изменяет размер в байтах, используемый для выравнивания. В языке C++ структура идентична классу C++, но имеет другую видимость по умолчанию: члены класса по умолчанию являются закрытыми, а члены структуры — открытыми.

На других языках

Структурный тип данных в C был создан на основе структурного типа данных ALGOL 68. Как и в C, тип данных struct в C# (Structure в Visual Basic NET) аналогичен классу. Основное различие между структурой и классом в этих языках заключается в том, что любые изменения структуры, переданной в функцию в качестве аргумента, не отразятся на исходной переменной (если не используется передача по ссылке). Это отличается от C++, где классы или структуры могут быть статически или динамически выделены либо в стеке (как в C#), либо в куче, с использованием явного указателя. В C++ единственное различие между структурой и классом состоит в том, что члены и базовые классы структуры по умолчанию являются публичными. (Класс, определенный с помощью ключевого слова class, по умолчанию имеет приватные члены и базовые классы.)