Jump to content

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

Структура записи в языке программирования C (и многих его производных) — это объявление составного типа данных (или ) , которое определяет физически сгруппированный список переменных под одним именем в блоке памяти, что позволяет получать доступ к различным переменным через один указатель. или по объявленному имени структуры, которое возвращает тот же адрес. Тип данных struct может содержать другие типы данных, поэтому он используется для записей смешанного типа данных, таких как запись каталога жесткого диска (длина файла, имя, расширение, физический адрес и т. д.) или других записей смешанного типа (имя , адрес, телефон, баланс и т.д.).

Структура C напрямую ссылается на непрерывный блок физической памяти, обычно ограниченный (размерный) границами длины слова. Это соответствует одноименной функции, доступной в некоторых ассемблерах для процессоров Intel. Будучи блоком непрерывной памяти, каждое поле внутри структуры расположено с определенным фиксированным смещением от начала.

Поскольку содержимое структуры хранится в непрерывной памяти, оператор sizeof необходимо использовать для получения количества байтов, необходимых для хранения структуры определенного типа, точно так же, как его можно использовать для примитивов . Выравнивание отдельных полей в структуре (по границам слов ) зависит от реализации и может включать заполнение, хотя современные компиляторы обычно поддерживают #pragma pack директива, которая изменяет размер в байтах, используемый для выравнивания. [1]

В языке C++ структура идентична классу C++, но имеет другую видимость по умолчанию: члены класса по умолчанию являются закрытыми, тогда как члены структуры по умолчанию являются общедоступными.

На других языках [ править ]

Тип данных struct в C был получен из типа данных struct ALGOL 68 . [2]

Как и его аналог в C, тип данных struct в C# ( Structure в Visual Basic .NET ) аналогичен классу . Самая большая разница между структурой и классом в этих языках заключается в том, что когда структура передается в качестве аргумента функции, любые изменения структуры в этой функции не будут отражены в исходной переменной (если только не используется передача по ссылке). использовал). [3]

Это отличается от C++, где классы или структуры могут быть выделены статически или динамически либо в стеке (аналогично C#), либо в куче с явным указателем. В C++ единственная разница между структурой и классом заключается в том, что члены и базовые классы структуры являются общедоступными по умолчанию . (Класс, определенный с помощью class имеет частные Ключевое слово по умолчанию члены и базовые классы.)

Декларация [ править ]

Общий синтаксис объявления структуры в C:

struct tag_name {
   type member1;
   type member2;
   /* declare as many members as desired, but the entire structure size must be known to the compiler. */
};

Здесь tag_name в некоторых контекстах является необязательным.

Такой struct Объявление также может появляться в контексте объявления typedef псевдонима типа или объявления или определения переменной:

typedef struct tag_name {
   type member1;
   type member2;
} struct_alias;

Инициализация [ править ]

Существует три способа инициализации структуры. Для struct тип

/* Declare the struct with integer members x, y */
struct point {
   int x;
   int y;
};

Инициализаторы в стиле C89 используются, когда могут быть указаны смежные члены. [4]

/* Define variable 'a' of type point, and initialize its first two members in place */
struct point a = { 1, 2 };

Для списка несмежных или неупорядоченных элементов назначен стиль инициализатора. [5] может быть использован

/* Define variable 'a' of type point, and set members using designated initializers */
struct point a = { .y = 2, .x = 1 };

Если задан инициализатор или объект выделен статически , пропущенные элементы инициализируются значением 0.

Третий способ инициализации структуры — скопировать значение существующего объекта того же типа.

/* Define variable 'b' of type point, and set members to the same values as those of 'a' */
struct point b = a;

Назначение [ править ]

Структура может быть присвоена другой структуре. Компилятор может использовать memcpy() выполнить такое задание.

struct point {
    int x;
    int y;
};

int main(void)
{
    struct point a = { 1, 3 }; /* initialized variable */
    struct point b;            /* uninitialized */
    b = a;                     /* copy member values from 'a' into 'b' */
    return 0;
}

Указатели на структуру [ править ]

Указатели могут использоваться для ссылки на struct по его адресу. Это полезно для передачи структур в функцию. Указатель можно разыменовать с помощью * оператор. -> оператор разыменовывает указатель на структуру (левый операнд), а затем получает доступ к значению члена структуры (правый операнд).

struct point {
   int x;
   int y;
};
struct point my_point = { 3, 7 };
struct point *p = &my_point;  /* 'p' is a pointer to my_point */
(*p).x = 8;                   /* set the first member of the struct */
p->x = 8;                     /* equivalent method to set the first member of the struct */

См. также [ править ]

Ссылки [ править ]

  1. ^ «Разметка структурной памяти в C» . Переполнение стека .
  2. ^ Ричи, Деннис М. (март 1993 г.). «Развитие языка Си» . Уведомления ACM SIGPLAN . 28 (3): 201–208. дои : 10.1145/155360.155580 . Схема композиции типов, принятая К., во многом обязана Алголу 68, хотя, возможно, она не появилась в форме, которую одобрили бы приверженцы Алгола. Центральным понятием, которое я усвоил из Алгола, была структура типов, основанная на атомарных типах (включая структуры), состоящих из массивов, указателей (ссылок) и функций (процедур). Концепция объединений и приведения Алгола 68 также оказала влияние, появившееся позже.
  3. ^ «Передача параметров в C#» .
  4. ^ Келли, Эл; Поль, Ира (2004). Книга о C: Программирование на C (Четвертое изд.). стр. 418 . ISBN  0-201-18399-4 .
  5. ^ «Компиляторы IBM Linux. Инициализация структур и объединений» .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 18890ceaacaf03cdabaf5dc9cf2e8cf0__1714877880
URL1:https://arc.ask3.ru/arc/aa/18/f0/18890ceaacaf03cdabaf5dc9cf2e8cf0.html
Заголовок, (Title) документа по адресу, URL1:
struct (C programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)