У мові програмування C struct — ключове слово, яке використовують для визначення складеного типу даних (запису) – розташованого в пам'яті іменованого набору значень. Це дозволяє отримати доступ до різних значень через один ідентифікатор (часто вказівник). Структура може містити дані різних типів. Наприклад, структура клієнта банку може містити поля: ПІБ, адреса, телефон, баланс.
Структура займає суцільний блок пам'яті, зазвичай вирівняний за межами слів. Аналогічна функція доступна в деяких асемблерах для процесорів Intel. Отже, кожне поле в ній розташоване з певним фіксованим зміщенням від початку.
Оператор [en], як і для примітивного типу даних, повертає кількість байтів, необхідних для збереження структури. Вирівнювання окремих полів у структурі (відносно меж слів) залежить від реалізації та може включати доповнення. Сучасні компілятори зазвичай підтримують директиву #pragma pack
, яка встановлює розмір у байтах для вирівнювання.
Функцію C struct запозичено з однойменної концепції в [en].
Оголошення
Синтаксис для оголошення структури розглянемо на простому прикладі:
struct tag_name { type member1; type member2; };
tag_name
у деяких випадках зазначати не обов'язково.
typedef
За допомогою ключового слова [en] на тип структури можна посилатися без використання ключового слова struct
. Однак деякі посібники зі стилю програмування не радять цього, стверджуючи, що це може спричинити плутанину типів.
Наприклад:
typedef struct tag_name { type member1; type member2; } thing_t; thing_t thing;
У коді C++ typedef не потрібне, оскільки типи, визначені за допомогою struct
є частиною звичайного простору назв, тому тип можна називати або struct thing_t
або thing_t
.
Ініціалізація
Три способи ініціалізації структури розглянемо на прикладі такого типу:
struct point_t { int x; int y; };
Коли можна задати суміжні члени, використовують ініціалізатори у стилі C89:
struct point_t a = { 1, 2 };
Для несуміжного або непорядкового списку членів можна використати іменований стиль ініціалізатора. Наприклад:
struct point_t a = { .y = 2, .x = 1 };
Якщо задано ініціалізатор або якщо об'єкт виділено статично, пропущені елементи ініціалізуються нулями. Третій спосіб ініціалізації структури полягає в тому, щоб скопіювати значення наявного об'єкта того ж типу:
struct point_t b = a;
Копіювати
Стан структури можна скопіювати в інший примірник. Для копіювання байтів блоку пам'яті компілятор може використовувати memcpy()
.
struct point_t a = { 1, 3 }; struct point_t b; b = 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++
У struct по суті така ж, як і в C. Крім того, — це те саме, що й struct, але з іншою типовою [en]: члени класу за замовчуванням є приватними, тоді як члени структури — публічними.
.NET
Мови .NET мають структуру даних, подібну до struct у C, яка в C# має назву struct
, а у Visual Basic.NET — Structure
). Вона надає багато можливостей класу, але діє як значеннєвий, а не посилальний тип. Наприклад, під час передавання .NET struct у функцію, значення копіюється, тому зміни вхідного параметра не впливають на передане значення.
Див. також
- [en] — структура даних, яка відображає один або кілька сусідніх бітів
- [en] — функція мови C, завдяки якій структура може містити останнім членом масив без заданого розміру
- [en] — інша назва для записів
- Об'єднання (структура даних) — тип даних, який допускає значення, які можуть мати кілька різних подань
Примітки
- Struct memory layout in C. Stack Overflow.
- Ritchie, Dennis M. (March 1993). The Development of the C Language. ACM SIGPLAN Notices. 28 (3): 201—208. doi:10.1145/155360.155580.
The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. The central notion I captured from Algol was a type structure based on atomic types (including structures), composed into arrays, pointers (references), and functions (procedures). Algol 68's concept of unions and casts also had an influence that appeared later.
- Kelley, Al; Pohl, Ira (2004). A Book On C: Programming in C (вид. Fourth). с. 418. ISBN .
- IBM Linux compilers. Initialization of structures and unions.
- Parameter passing in C#. Архів оригіналу за 30 травня 2016. Процитовано 14 серпня 2024.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U movi programuvannya C struct klyuchove slovo yake vikoristovuyut dlya viznachennya skladenogo tipu danih zapisu roztashovanogo v pam yati imenovanogo naboru znachen Ce dozvolyaye otrimati dostup do riznih znachen cherez odin identifikator chasto vkazivnik Struktura mozhe mistiti dani riznih tipiv Napriklad struktura kliyenta banku mozhe mistiti polya PIB adresa telefon balans Struktura zajmaye sucilnij blok pam yati zazvichaj virivnyanij za mezhami sliv Analogichna funkciya dostupna v deyakih asemblerah dlya procesoriv Intel Otzhe kozhne pole v nij roztashovane z pevnim fiksovanim zmishennyam vid pochatku Operator en yak i dlya primitivnogo tipu danih povertaye kilkist bajtiv neobhidnih dlya zberezhennya strukturi Virivnyuvannya okremih poliv u strukturi vidnosno mezh sliv zalezhit vid realizaciyi ta mozhe vklyuchati dopovnennya Suchasni kompilyatori zazvichaj pidtrimuyut direktivu pragma pack yaka vstanovlyuye rozmir u bajtah dlya virivnyuvannya Funkciyu C struct zapozicheno z odnojmennoyi koncepciyi v en OgoloshennyaSintaksis dlya ogoloshennya strukturi rozglyanemo na prostomu prikladi struct tag name type member1 type member2 tag name u deyakih vipadkah zaznachati ne obov yazkovo typedefZa dopomogoyu klyuchovogo slova en na tip strukturi mozhna posilatisya bez vikoristannya klyuchovogo slova struct Odnak deyaki posibniki zi stilyu programuvannya ne radyat cogo stverdzhuyuchi sho ce mozhe sprichiniti plutaninu tipiv Napriklad typedef struct tag name type member1 type member2 thing t thing t thing U kodi C typedef ne potribne oskilki tipi viznacheni za dopomogoyu struct ye chastinoyu zvichajnogo prostoru nazv tomu tip mozhna nazivati abo struct thing t abo thing t InicializaciyaTri sposobi inicializaciyi strukturi rozglyanemo na prikladi takogo tipu struct point t int x int y Koli mozhna zadati sumizhni chleni vikoristovuyut inicializatori u stili C89 struct point t a 1 2 Dlya nesumizhnogo abo neporyadkovogo spisku chleniv mozhna vikoristati imenovanij stil inicializatora Napriklad struct point t a y 2 x 1 Yaksho zadano inicializator abo yaksho ob yekt vidileno statichno propusheni elementi inicializuyutsya nulyami Tretij sposib inicializaciyi strukturi polyagaye v tomu shob skopiyuvati znachennya nayavnogo ob yekta togo zh tipu struct point t b a KopiyuvatiStan strukturi mozhna skopiyuvati v inshij primirnik Dlya kopiyuvannya bajtiv bloku pam yati kompilyator mozhe vikoristovuvati memcpy struct point t a 1 3 struct point t b b a VkazivnikiDlya posilannya na struct za yiyi adresoyu mozhna vikoristovuvati vkazivniki Ce korisno dlya peredannya strukturi u funkciyu shob uniknuti vitrat na kopiyuvannya strukturi Operator gt rozimenovuye vkazivnik livij operand i otrimuye dostup do znachennya chlena strukturi pravij operand struct point t point 3 7 int x point x point x 10 struct point t pp amp point x pp gt x pp gt x 8 V inshih movahC U C struct po suti taka zh yak i v C Krim togo class ce te same sho j struct ale z inshoyu tipovoyu en chleni klasu za zamovchuvannyam ye privatnimi todi yak chleni strukturi publichnimi NET Movi NET mayut strukturu danih podibnu do struct u C yaka v C maye nazvu struct a u Visual Basic NET Structure Vona nadaye bagato mozhlivostej klasu ale diye yak znachennyevij a ne posilalnij tip Napriklad pid chas peredavannya NET struct u funkciyu znachennya kopiyuyetsya tomu zmini vhidnogo parametra ne vplivayut na peredane znachennya Div takozh en struktura danih yaka vidobrazhaye odin abo kilka susidnih bitiv en funkciya movi C zavdyaki yakij struktura mozhe mistiti ostannim chlenom masiv bez zadanogo rozmiru en insha nazva dlya zapisiv Ob yednannya struktura danih tip danih yakij dopuskaye znachennya yaki mozhut mati kilka riznih podanPrimitkiStruct memory layout in C Stack Overflow Ritchie Dennis M March 1993 The Development of the C Language ACM SIGPLAN Notices 28 3 201 208 doi 10 1145 155360 155580 The scheme of type composition adopted by C owes considerable debt to Algol 68 although it did not perhaps emerge in a form that Algol s adherents would approve of The central notion I captured from Algol was a type structure based on atomic types including structures composed into arrays pointers references and functions procedures Algol 68 s concept of unions and casts also had an influence that appeared later Kelley Al Pohl Ira 2004 A Book On C Programming in C vid Fourth s 418 ISBN 0 201 18399 4 IBM Linux compilers Initialization of structures and unions Parameter passing in C Arhiv originalu za 30 travnya 2016 Procitovano 14 serpnya 2024