stringtranslate.com

структура (язык программирования C)

В языке программирования 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]

Смотрите также

Ссылки

  1. ^ "Структурная структура памяти в C". Stack Overflow .
  2. ^ Ritchie, Dennis M. (март 1993 г.). "Развитие языка C". ACM SIGPLAN Notices . 28 (3): 201–208. doi : 10.1145/155360.155580 . Схема композиции типов, принятая в C, во многом обязана Algol 68, хотя она, возможно, не появилась в той форме, которую одобрили бы приверженцы Algol. Центральным понятием, которое я заимствовал из Algol, была структура типов, основанная на атомарных типах (включая структуры), составленных в массивы, указатели (ссылки) и функции (процедуры). Концепция объединений и приведений Algol 68 также оказала влияние, которое проявилось позже.
  3. ^ Келли, Эл; Пол, Айра (2004). Книга о C: Программирование на C (Четвертое издание). С. 418. ISBN 0-201-18399-4.
  4. ^ «Компиляторы IBM Linux. Инициализация структур и объединений».
  5. ^ «Передача параметров в C#».