logo

C štruktúry

Štruktúra v C je užívateľsky definovaný dátový typ, ktorý možno použiť na zoskupenie položiek možno rôznych typov do jedného typu. The kľúčové slovo struct sa používa na definovanie štruktúry v programovacom jazyku C. Položky v štruktúre sa nazývajú jeho členom a môžu mať akýkoľvek platný dátový typ.

C štruktúry

C Vyhlásenie o štruktúre

Pred použitím v našom programe musíme štruktúru deklarovať v C. V deklarácii štruktúry špecifikujeme jej členské premenné spolu s ich dátovým typom. Kľúčové slovo struct môžeme použiť na deklarovanie štruktúry v C pomocou nasledujúcej syntaxe:



Syntax

 struct structure_name { data_type member_name1;  data_type member_name1; .... .... };>

Vyššie uvedená syntax sa tiež nazýva šablóna štruktúry alebo prototyp štruktúry a v deklarácii nie je štruktúre pridelená žiadna pamäť.

C Definícia štruktúry

Aby sme mohli použiť štruktúru v našom programe, musíme definovať jej inštanciu. Môžeme to urobiť vytvorením premenných typu štruktúra. Štruktúrne premenné môžeme definovať dvoma spôsobmi:

1. Vyhlásenie premennej štruktúry so šablónou štruktúry

 struct structure_name { data_type member_name1; data_type member_name1; .... .... }  variable1, varaible2, ...  ;>

2. Vyhlásenie premennej štruktúry po šablóne štruktúry

// structure declared beforehand struct structure_name  variable1, variable2  , .......;>

Členovia prístupovej štruktúry

K členom štruktúry môžeme pristupovať pomocou ( . ) bodkový operátor.



Syntax

structure_name.member1; strcuture_name.member2;>

V prípade, že máme ukazovateľ na štruktúru, môžeme na prístup k členom použiť aj operátor šípky.

Inicializujte členov štruktúry

Členovia štruktúry nemôže byť inicializované deklaráciou. Napríklad nasledujúci program C zlyhá pri kompilácii.

struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };>

Dôvod vyššie uvedenej chyby je jednoduchý. Keď je deklarovaný dátový typ, nie je preň pridelená žiadna pamäť. Pamäť je alokovaná iba vtedy, keď sú vytvorené premenné.



Členy štruktúry môžeme inicializovať 3 spôsobmi, ktoré sú nasledovné:

  1. Použitie operátora priradenia.
  2. Používanie zoznamu inicializátorov.
  3. Používanie zoznamu určených inicializátorov.

1. Inicializácia pomocou operátora priradenia

 struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>

2. Inicializácia pomocou zoznamu inicializátorov

 struct structure_name str = { value1, value2, value3 };>

Pri tomto type inicializácie sa hodnoty priraďujú v sekvenčnom poradí, ako sú deklarované v šablóne štruktúry.

podčiarknuť pomocou css

3. Inicializácia pomocou zoznamu určených inicializátorov

Určená inicializácia umožňuje členom štruktúry inicializovať v akomkoľvek poradí. Táto funkcia bola pridaná do štandardu C99.

 struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };>

Určená inicializácia je podporovaná iba v C, ale nie v C++.

Príklad štruktúry v C

Nasledujúci program C ukazuje, ako používať štruktúry

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;> }>

>

>

Výkon

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 pre štruktúry

The typdef Kľúčové slovo sa používa na definovanie aliasu pre už existujúci typ údajov. V štruktúrach musíme na definovanie premenných použiť kľúčové slovo struct spolu s názvom štruktúry. Niekedy to zvyšuje dĺžku a zložitosť kódu. Definíciu typu môžeme použiť na definovanie nejakého nového kratšieho názvu štruktúry.

Príklad

C




Proces Android acore sa stále zastavuje
// 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;> }>

>

>

Výkon

var1.a = 20 var2.x = 314>

Vnorené štruktúry

Jazyk C nám umožňuje vložiť jednu štruktúru do druhej ako člen. Tento proces sa nazýva vnorenie a takéto štruktúry sa nazývajú vnorené štruktúry. Existujú dva spôsoby, ako môžeme vložiť jednu štruktúru do druhej:

1. Vnorenie vstavanej štruktúry

V tejto metóde je vnorená štruktúra deklarovaná aj vo vnútri nadradenej štruktúry.

Príklad

struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }>

2. Samostatné vkladanie štruktúry

Pri tejto metóde sa dve štruktúry deklarujú oddelene a potom sa členská štruktúra vnorí do nadradenej štruktúry.

Príklad

struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }>

Jedna vec, ktorú treba poznamenať, je, že deklarácia štruktúry by mala byť vždy prítomná pred jej definíciou ako člena štruktúry. Napríklad, nižšie uvedené vyhlásenie je neplatné pretože struct mem nie je definovaná, keď je deklarovaná v nadradenej štruktúre.

struct parent { struct mem a; }; struct mem { int var; };>

Prístup k vnoreným členom

K vnoreným členom môžeme pristupovať pomocou rovnakého (.) bodkového operátora dvakrát, ako je znázornené:

 str_parent.str_child .member;>

Príklad vnorenia štruktúry

C




// 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;> }>

>

>

Výkon

amplitúdovej modulácie
var1.a = 25 var1.b.x = 195 var1.b.c = A>

Ukazovateľ štruktúry v C

Môžeme definovať ukazovateľ, ktorý ukazuje na štruktúru ako ktorákoľvek iná premenná. Takéto ukazovatele sa všeobecne nazývajú Štruktúrne ukazovatele . K členom štruktúry, na ktorú ukazuje ukazovateľ štruktúry, môžeme pristupovať pomocou ( -> ) šípkový operátor.

Príklad ukazovateľa štruktúry

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;> }>

>

>

Výkon

1 2>

Samoreferenčné štruktúry

Samoreferenčné štruktúry v C sú tie štruktúry, ktoré obsahujú odkazy na rovnaký typ ako samy seba, t. j. obsahujú člena typu ukazovateľ smerujúci na rovnaký typ štruktúry.

Príklad sebareferenčných štruktúr

 struct structure_name { data_type member1;  data_type member2;  struct structure_name* str;  }>

C




ubuntu ktorý príkaz

// 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->next->mem1,> >ptr1->dalsi->mem2);> > >return> 0;> }>

>

>

Výkon

var2.mem1: 10 var2.mem2: 20>

Takéto druhy štruktúr sa používajú v rôznych dátových štruktúrach, ako napríklad na definovanie uzlov prepojených zoznamov, stromov atď.

C štruktúra polstrovanie a balenie

Technicky by veľkosť konštrukcie v C mala byť súčtom veľkostí jej členov. Ale vo väčšine prípadov to nemusí byť pravda. Dôvodom je štruktúra čalúnenia.

Výplň štruktúry je koncept pridania viacerých prázdnych bajtov do štruktúry na prirodzené zarovnanie dátových členov v pamäti. Robí sa to s cieľom minimalizovať cykly čítania CPU na získanie rôznych dátových členov v štruktúre.

Existujú situácie, keď potrebujeme štruktúru pevne zbaliť odstránením prázdnych bajtov. V takýchto prípadoch používame Balenie štruktúry. Jazyk C poskytuje dva spôsoby balenia štruktúry:

  1. Používanie balíka #pragma(1)
  2. Použitie __attribute((zabalené))__

Príklad výplne a balenia štruktúry

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;> }>

>

>

Výkon

Size of str1: 8 Size of str2: 5>

Ako môžeme vidieť, veľkosť štruktúry sa mení, keď sa vykonáva balenie štruktúry.

Ak sa chcete dozvedieť viac o výplni a balení štruktúry, pozrite si tento článok – Bitové polia sa používajú na určenie dĺžky členov štruktúry v bitoch. Keď poznáme maximálnu dĺžku člena, môžeme použiť bitové polia na určenie veľkosti a zníženie spotreby pamäte.

Syntax bitových polí

struct structure_name  { data_type member_name : width_of_bit-field; };>

Príklad bitových polí

C

hackerské spracovanie




// 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;> }>

>

>

Výkon

Size of Str1: 8 Size of Str2: 4>

Ako vidíme, veľkosť štruktúry sa zníži pri použití bitového poľa na definovanie maximálnej veľkosti člena „a“.

Použitie štruktúry v C

C štruktúry sa používajú na:

  1. Štruktúru možno použiť na definovanie vlastných dátových typov, ktoré možno použiť na vytvorenie niektorých komplexných dátových typov, ako sú dátumy, čas, komplexné čísla atď., ktoré sa v jazyku nenachádzajú.
  2. Môže byť tiež použitý pri organizácii údajov, kde je možné uložiť veľké množstvo údajov v rôznych poliach.
  3. Štruktúry sa používajú na vytváranie dátových štruktúr, ako sú stromy, prepojené zoznamy atď.
  4. Môžu byť tiež použité na vrátenie viacerých hodnôt z funkcie.

Obmedzenia C štruktúr

V jazyku C poskytujú štruktúry metódu na spájanie údajov rôznych typov. Štruktúra je užitočný nástroj na prácu so skupinou logicky súvisiacich dátových položiek. C štruktúry však majú aj určité obmedzenia.

    Vyššia spotreba pamäte: Je to spôsobené výplňou štruktúry. Žiadne skrytie údajov: C štruktúry neumožňujú skrytie údajov. K členom štruktúry môže pristupovať akákoľvek funkcia kdekoľvek v rámci štruktúry. Funkcie vo vnútri štruktúry: C štruktúry nepovoľujú funkcie vo vnútri štruktúry, takže nemôžeme poskytnúť súvisiace funkcie. Statické členy: Štruktúra C nemôže mať vo svojom tele statické členy. Vytváranie konštrukcie v štruktúre: Štruktúry v C nemôžu mať konštruktor vo vnútri štruktúr.

Súvisiace články

  • C Structures vs C++ Structure