Топ питань
Часова шкала
Чат
Перспективи
Struct (мова програмування C)
структурований тип даних у мові програмування C З Вікіпедії, вільної енциклопедії
Remove ads
У мові програмування C struct — ключове слово, яке використовують для визначення складеного типу даних (запису) – розташованого в пам'яті іменованого набору значень. Це дозволяє отримати доступ до різних значень через один ідентифікатор (часто вказівник). Структура може містити дані різних типів. Наприклад, структура клієнта банку може містити поля: ПІБ, адреса, телефон, баланс.
Структура займає суцільний блок пам'яті, зазвичай вирівняний за межами слів. Аналогічна функція доступна в деяких асемблерах для процесорів Intel. Отже, кожне поле в ній розташоване з певним фіксованим зміщенням від початку.
Оператор sizeof[en], як і для примітивного типу даних, повертає кількість байтів, необхідних для збереження структури. Вирівнювання окремих полів у структурі (відносно меж слів) залежить від реалізації та може включати доповнення. Сучасні компілятори зазвичай підтримують директиву #pragma pack
, яка встановлює розмір у байтах для вирівнювання[1].
Функцію C struct запозичено з однойменної концепції в ALGOL 68[en][2].
Remove ads
Оголошення
Синтаксис для оголошення структури розглянемо на простому прикладі:
struct tag_name {
type member1;
type member2;
};
tag_name
у деяких випадках зазначати не обов'язково.
typedef
За допомогою ключового слова typedef[en] на тип структури можна посилатися без використання ключового слова struct
. Однак деякі посібники зі стилю програмування не радять цього, стверджуючи, що це може спричинити плутанину типів.
Наприклад:
typedef struct tag_name {
type member1;
type member2;
} thing_t;
thing_t thing;
У коді C++ typedef не потрібне, оскільки типи, визначені за допомогою struct
є частиною звичайного простору назв, тому тип можна називати або struct thing_t
або thing_t
.
Remove ads
Ініціалізація
Три способи ініціалізації структури розглянемо на прикладі такого типу:
struct point_t {
int x;
int y;
};
Коли можна задати суміжні члени, використовують ініціалізатори у стилі C89[3]:
struct point_t a = { 1, 2 };
Для несуміжного або непорядкового списку членів можна використати іменований стиль ініціалізатора[4]. Наприклад:
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;
Remove ads
В інших мовах
C++
У C++ struct по суті така ж, як і в C. Крім того, class — це те саме, що й struct, але з іншою типовою видимістю[en]: члени класу за замовчуванням є приватними, тоді як члени структури — публічними.
.NET
Мови .NET мають структуру даних, подібну до struct у C, яка в C# має назву struct
, а у Visual Basic.NET — Structure
). Вона надає багато можливостей класу, але діє як значеннєвий, а не посилальний тип. Наприклад, під час передавання .NET struct у функцію, значення копіюється, тому зміни вхідного параметра не впливають на передане значення[5].
Remove ads
Див. також
- Бітове поле[en] — структура даних, яка відображає один або кілька сусідніх бітів
- Гнучкий елемент масиву[en] — функція мови C, завдяки якій структура може містити останнім членом масив без заданого розміру
- Пасивна структура даних[en] — інша назва для записів
- Об'єднання (структура даних) — тип даних, який допускає значення, які можуть мати кілька різних подань
Примітки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads