В языке программирования C структура — это ключевое слово, используемое для определения составного типа данных , также известного как запись — именованного набора значений, которые занимают блок памяти. Он позволяет получать доступ к различным значениям через один идентификатор , часто указатель . Структура может содержать другие типы данных, поэтому используется для записей со смешанными типами данных. Например, структура клиента банка может содержать поля: имя, адрес, телефон, баланс.
Структура занимает непрерывный блок памяти, обычно ограниченный (размером) границами длины слова. Она соответствует одноименной функции, доступной в некоторых ассемблерах для процессоров Intel. Будучи блоком непрерывной памяти, каждое поле в структуре расположено с определенным фиксированным смещением от начала.
Оператор sizeof возвращает количество байтов, необходимых для хранения конкретной структуры, как и для примитивного типа данных . Выравнивание отдельных полей в структуре (относительно границ слов ) зависит от реализации и может включать заполнение. Современные компиляторы обычно поддерживают #pragma pack
директиву, которая задает размер в байтах для выравнивания. [1]
Функция C struct была получена из одноименной концепции в ALGOL 68. [ 2]
Синтаксис объявления структуры показан в этом простом примере:
struct tag_name { тип member1 ; тип member2 ; };
В некоторых контекстах это tag_name
необязательно.
С помощью ключевого слова typedef
можно ссылаться на тип структуры без использования struct
ключевого слова. Однако некоторые [ who? ] руководства по стилю программирования советуют этого не делать, утверждая, что это может запутать тип.
Например:
typedef struct tag_name { тип member1 ; тип member2 ; } вещь_t ; вещь_t вещь ;
В коде C++ typedef не нужен, поскольку типы, определенные с помощью , struct
являются частью обычного пространства имен, поэтому на тип можно ссылаться как на struct thing_t
или thing_t
.
Существует три способа инициализации структуры.
Для типа:
структура point_t { int x ; int y ; };
Инициализаторы в стиле C89 используются, когда могут быть заданы смежные члены. [3] Например:
структура point_t a = { 1 , 2 };
Для несмежных или неупорядоченных списков членов можно использовать назначенный стиль инициализатора . [4] Например:
структура point_t a = { . y = 2 , . x = 1 };
Если указан инициализатор или объект статически выделен , пропущенные элементы инициализируются значением 0.
Третий способ инициализации структуры — копирование значения существующего объекта того же типа. Например:
структура point_t b = a ;
Состояние структуры может быть скопировано в другой экземпляр. Компилятор может использовать memcpy()
для копирования байтов блока памяти.
структура point_t a = { 1 , 3 }; структура point_t b ; b = a ;
Указатели можно использовать для ссылки на a struct
по его адресу. Это полезно для передачи структуры в функцию, чтобы избежать накладных расходов на копирование структуры. ->
Оператор разыменовывает указатель (левый операнд) и получает доступ к значению члена структуры (правый операнд).
struct point_t point = { 3 , 7 }; int x = point . x ; point . x = 10 ; struct point_t * pp = & point ; x = pp -> x ; pp -> x = 8 ;
В C++ структура по сути та же самая, что и в C. Более того, класс — это то же самое, что и структура, но с другой видимостью по умолчанию : члены класса по умолчанию являются закрытыми, тогда как члены структуры по умолчанию являются открытыми.
В языках .NET есть функция, похожая на struct в C — называемая struct
в C# и Structure
в Visual Basic .NET ). Эта конструкция предоставляет множество функций класса, но действует как тип значения , а не как ссылочный тип . Например, при передаче структуры .NET в функцию значение копируется, так что изменения входного параметра не влияют на переданное значение. [5]
Схема композиции типов, принятая в C, во многом обязана Algol 68, хотя она, возможно, не появилась в той форме, которую одобрили бы приверженцы Algol. Центральным понятием, которое я заимствовал из Algol, была структура типов, основанная на атомарных типах (включая структуры), составленных в массивы, указатели (ссылки) и функции (процедуры). Концепция объединений и приведений Algol 68 также оказала влияние, которое проявилось позже.