Структура в C — це визначений користувачем тип даних, який можна використовувати для групування елементів, можливо, різних типів в один тип. The ключове слово struct використовується для визначення структури в мові програмування C. Елементи в структурі називаються його член і вони можуть мати будь-який допустимий тип даних.
C Декларація структури
Ми повинні оголосити структуру в C, перш ніж використовувати її в нашій програмі. В декларації структури ми вказуємо її змінні-члени разом із їхнім типом даних. Ми можемо використовувати ключове слово struct, щоб оголосити структуру в C за допомогою такого синтаксису:
Синтаксис
struct structure_name { data_type member_name1; data_type member_name1; .... .... };> Наведений вище синтаксис також називається шаблоном структури або прототипом структури, і в декларації для структури не виділяється пам’ять.
C Визначення структури
Щоб використовувати структуру в нашій програмі, ми повинні визначити її екземпляр. Ми можемо зробити це, створивши змінні структурного типу. Ми можемо визначити структурні змінні за допомогою двох методів:
1. Оголошення структурної змінної за допомогою шаблону структури
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;> 2. Оголошення структурної змінної після шаблону структури
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Члени структури доступу
Ми можемо отримати доступ до елементів структури за допомогою ( . ) оператор крапки.
Синтаксис
structure_name.member1; strcuture_name.member2;>
У випадку, коли ми маємо вказівник на структуру, ми також можемо використовувати оператор стрілки для доступу до членів.
Ініціалізація членів структури
Члени структури не може бути ініціалізується декларацією. Наприклад, компіляція наступної програми C не вдається.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };> Причина вищевказаної помилки проста. Коли тип даних оголошено, пам'ять для нього не виділяється. Пам'ять виділяється лише під час створення змінних.
Ми можемо ініціалізувати члени структури трьома способами:
- Використання оператора присвоєння.
- Використання списку ініціалізаторів.
- Використання призначеного списку ініціалізаторів.
1. Ініціалізація за допомогою оператора присвоєння
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Ініціалізація за допомогою Initializer List
struct structure_name str = { value1, value2, value3 };> У цьому типі ініціалізації значення призначаються в послідовному порядку, як вони оголошені в шаблоні структури.
3. Ініціалізація за допомогою призначеного списку ініціалізаторів
Призначена ініціалізація дозволяє ініціалізувати члени структури в будь-якому порядку. Ця функція була додана в стандарт C99.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };> Призначена ініціалізація підтримується лише в C, але не в C++.
Приклад структури в C
Наступна програма на C показує, як використовувати структури
C
// C program to illustrate the use of structures> #include> > // declaring structure with name str1> struct> str1 {> >int> i;> >char> c;> >float> f;> >char> s[30];> };> > // declaring structure with name str2> struct> str2 {> >int> ii;> >char> cc;> >float> ff;> } var;>// variable declaration with structure template> > // Driver code> int> main()> {> >// variable declaration after structure template> >// initialization with initializer list and designated> >// initializer list> >struct> str1 var1 = { 1,>'A'>, 1.00,>'techcodeview.com'> },> >var2;> >struct> str2 var3 = { .ff = 5.00, .ii = 5, .cc =>'a'> };> > >// copying structure using assignment operator> >var2 = var1;> > >printf>(>'Struct 1:
i = %d, c = %c, f = %f, s = %s
'>,> >var1.i, var1.c, var1.f, var1.s);> >printf>(>'Struct 2:
i = %d, c = %c, f = %f, s = %s
'>,> >var2.i, var2.c, var2.f, var2.s);> >printf>(>'Struct 3
i = %d, c = %c, f = %f
'>, var3.ii,> >var3.cc, var3.ff);> > >return> 0;> }> |
>
спробуйте структуру даних
>Вихід
Struct 1: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 2: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 3 i = 5, c = a, f = 5.000000>
typedef для структур
The typedef Ключове слово використовується для визначення псевдоніма для вже існуючого типу даних. У структурах ми повинні використовувати ключове слово struct разом із назвою структури для визначення змінних. Іноді це збільшує довжину та складність коду. Ми можемо використовувати typedef, щоб визначити нову коротшу назву для структури.
приклад
C
// C Program to illustrate the use of typedef with> // structures> #include> > // defining structure> struct> str1 {> >int> a;> };> > // defining new name for str1> typedef> struct> str1 str1;> > // another way of using typedef with structures> typedef> struct> str2 {> >int> x;> } str2;> > int> main()> {> >// creating structure variables using new names> >str1 var1 = { 20 };> >str2 var2 = { 314 };> > >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var2.x = %d'>, var2.x);> > >return> 0;> }> |
>
>Вихід
var1.a = 20 var2.x = 314>
Вкладені структури
Мова C дозволяє нам вставляти одну структуру в іншу як член. Цей процес називається вкладеністю, а такі структури — вкладеними структурами. Є два способи, за допомогою яких ми можемо вкладати одну структуру в іншу:
1. Розкладка вбудованої структури
У цьому методі вкладена структура також оголошується всередині батьківської структури.
приклад
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }> 2. Розкладка окремої структури
У цьому методі дві структури оголошуються окремо, а потім структура-член вкладається в батьківську структуру.
приклад
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }> Тут слід зауважити, що оголошення структури завжди повинно бути присутнім перед її визначенням як члена структури. Наприклад, декларація нижче недійсна оскільки struct mem не визначена, коли вона оголошена всередині батьківської структури.
struct parent { struct mem a; }; struct mem { int var; };> Доступ до вкладених членів
Ми можемо отримати доступ до вкладених членів, використовуючи один і той самий ( . ) оператор точки двічі, як показано:
str_parent.str_child .member;>
Приклад вкладеності структури
C
чи може Android грати в gamepigeon
// C Program to illustrate structure nesting along with> // forward declaration> #include> > // child structure declaration> struct> child {> >int> x;> >char> c;> };> > // parent structure declaration> struct> parent {> >int> a;> >struct> child b;> };> > // driver code> int> main()> {> >struct> parent var1 = { 25, 195,>'A'> };> > >// accessing and printing nested members> >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var1.b.x = %d
'>, var1.b.x);> >printf>(>'var1.b.c = %c'>, var1.b.c);> > >return> 0;> }> |
>
>Вихід
var1.a = 25 var1.b.x = 195 var1.b.c = A>
Покажчик структури в C
Ми можемо визначити покажчик, який вказує на структуру, як і будь-яка інша змінна. Такі покажчики зазвичай називаються Покажчики структури . Ми можемо отримати доступ до членів структури, на які вказує покажчик структури, використовуючи ( -> ) оператор стрілки.
Приклад покажчика структури
C
// C program to illustrate the structure pointer> #include> > // structure declaration> struct> Point {> >int> x, y;> };> > int> main()> {> >struct> Point str = { 1, 2 };> > >// p2 is a pointer to structure p1> >struct> Point* ptr = &str;> > >// Accessing structure members using structure pointer> >printf>(>'%d %d'>, ptr->x, ptr->y);> > >return> 0;> }> |
>
>Вихід
1 2>
Самореференційні структури
Самопосилальні структури в C - це ті структури, які містять посилання на той самий тип, що й вони самі, тобто вони містять член покажчика типу, що вказує на той самий тип структури.
Приклад самопосилальних структур
struct structure_name { data_type member1; data_type member2; struct structure_name* str; }> C
// C program to illustrate the self referential structures> #include> > // structure template> typedef> struct> str {> >int> mem1;> >int> mem2;> >struct> str* next;> }str;> > // driver code> int> main()> {> >str var1 = { 1, 2, NULL };> >str var2 = { 10, 20, NULL };> > >// assigning the address of var2 to var1.next> >var1.next = &var2;> > >// pointer to var1> >str *ptr1 = &var1;> > >// accessing var2 members using var1> >printf>(>'var2.mem1: %d
var2.mem2: %d'>, ptr1->далі->mem1,> >ptr1->наступний->mem2);> > >return> 0;> }> |
>
>Вихід
var2.mem1: 10 var2.mem2: 20>
Такі типи структур використовуються в різних структурах даних, наприклад, для визначення вузлів пов’язаних списків, дерев тощо.
C Оббивка та упаковка структури
Технічно розмір структури в C повинен бути сумою розмірів її членів. Але в більшості випадків це може бути неправдою. Причиною цього є заповнення структури.
Оббивка структури це концепція додавання кількох порожніх байтів у структуру для природного вирівнювання елементів даних у пам’яті. Це робиться для того, щоб мінімізувати цикли читання ЦП для отримання різних членів даних у структурі.
метод java
Є деякі ситуації, коли нам потрібно щільно упакувати структуру, видаливши порожні байти. У таких випадках ми використовуємо Упаковка структури. Мова C надає два способи пакування структури:
- Використання #pragma pack(1)
- Використання __attribute((packed))__
Приклад доповнення та упаковки структури
C
// C program to illustrate structure padding and packing> #include> > // structure with padding> struct> str1 {> >char> c;> >int> i;> };> > struct> str2 {> >char> c;> >int> i;> } __attribute((packed)) __;>// using structure packing> > // driver code> int> main()> {> > >printf>(>'Size of str1: %d
'>,>sizeof>(>struct> str1));> >printf>(>'Size of str2: %d
'>,>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Вихід
Size of str1: 8 Size of str2: 5>
Як бачимо, при укладанні конструкції змінюється розмір конструкції.
Щоб дізнатися більше про заповнення та пакування структури, зверніться до цієї статті – бітові поля використовуються для визначення довжини елементів структури в бітах. Коли ми знаємо максимальну довжину члена, ми можемо використовувати бітові поля, щоб вказати розмір і зменшити споживання пам’яті.
Синтаксис бітових полів
struct structure_name { data_type member_name : width_of_bit-field; };> Приклад бітових полів
C
// C Program to illustrate bit fields in structures> #include> > // declaring structure for reference> struct> str1 {> >int> a;> >char> c;> };> > // structure with bit fields> struct> str2 {> >int> a : 24;>// size of 'a' is 3 bytes = 24 bits> >char> c;> };> > // driver code> int> main()> {> >printf>(>'Size of Str1: %d
Size of Str2: %d'>,> >sizeof>(>struct> str1),>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Вихід
Size of Str1: 8 Size of Str2: 4>
Як ми бачимо, розмір структури зменшується при використанні бітового поля для визначення максимального розміру члена «a».
Використання структури в C
Структури C використовуються для наступного:
- Структуру можна використовувати для визначення користувацьких типів даних, які можна використовувати для створення складних типів даних, таких як дати, час, комплексні числа тощо, яких немає в мові.
- Його також можна використовувати в організації даних, де велика кількість даних може зберігатися в різних полях.
- Структури використовуються для створення структур даних, таких як дерева, пов’язані списки тощо.
- Їх також можна використовувати для повернення кількох значень із функції.
Обмеження структур C
У мові C структури забезпечують метод упаковки разом даних різних типів. Структура — це корисний інструмент для обробки групи логічно пов’язаних елементів даних. Однак структури C також мають деякі обмеження.
- Більше споживання пам'яті: це пов'язано з доповненням структури. Відсутність приховування даних: структури C не дозволяють приховувати дані. До членів структури можна отримати доступ будь-якою функцією будь-де в області видимості структури. Функції всередині структури: структури C не дозволяють виконувати функції всередині структури, тому ми не можемо надати відповідні функції. Статичні елементи: структура C не може мати статичні елементи всередині тіла. Створення конструкції в Structure: Структури в C не можуть мати конструктор всередині Structures.
Схожі статті
- Структури C проти структури C++
