Struktura v C je uporabniško definiran podatkovni tip, ki se lahko uporablja za združevanje elementov po možnosti različnih tipov v en sam tip. The ključna beseda struct se uporablja za definiranje strukture v programskem jeziku C. Elementi v strukturi se imenujejo it član in so lahko katerega koli veljavnega podatkovnega tipa.
C Deklaracija strukture
Strukturo moramo deklarirati v C, preden jo uporabimo v našem programu. V deklaraciji strukture podamo njene članske spremenljivke skupaj z njihovim podatkovnim tipom. Uporabimo lahko ključno besedo struct za deklaracijo strukture v C z naslednjo sintakso:
Sintaksa
struct structure_name { data_type member_name1; data_type member_name1; .... .... };> Zgornja sintaksa se imenuje tudi predloga strukture ali prototip strukture in strukturi v deklaraciji ni dodeljen pomnilnik.
C Definicija strukture
Za uporabo strukture v našem programu moramo definirati njen primerek. To lahko storimo tako, da ustvarimo spremenljivke tipa strukture. Strukturne spremenljivke lahko definiramo z uporabo dveh metod:
1. Deklaracija strukturne spremenljivke s strukturno predlogo
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;> 2. Deklaracija strukturne spremenljivke po strukturni predlogi
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Člani strukture dostopa
Do članov strukture lahko dostopamo z uporabo ( . ) operator pike.
Sintaksa
structure_name.member1; strcuture_name.member2;>
V primeru, da imamo kazalec na strukturo, lahko za dostop do členov uporabimo tudi puščični operater.
Inicializirajte člane strukture
Člani strukture ne more biti inicializiran z deklaracijo. Na primer, naslednji program C ne uspe pri prevajanju.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };> Razlog za zgornjo napako je preprost. Ko je podatkovni tip deklariran, se zanj ne dodeli pomnilnik. Pomnilnik se dodeli le, ko so ustvarjene spremenljivke.
Člane strukture lahko inicializiramo na 3 načine, ki so naslednji:
- Uporaba operatorja dodelitve.
- Uporaba seznama inicializatorjev.
- Uporaba imenovanega seznama inicializatorjev.
1. Inicializacija z uporabo operatorja dodelitve
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Inicializacija s seznamom inicializatorjev
struct structure_name str = { value1, value2, value3 };> Pri tej vrsti inicializacije so vrednosti dodeljene v zaporednem vrstnem redu, kot so deklarirane v predlogi strukture.
3. Inicializacija z uporabo Designated Initializer List
Določena inicializacija omogoča inicializacijo članov strukture v poljubnem vrstnem redu. Ta funkcija je bila dodana v standard C99.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };> Določena inicializacija je podprta samo v C, ne pa tudi v C++.
Primer strukture v C
Naslednji program C prikazuje, kako uporabljati strukture
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;> }> |
>
konstruktorji v Javi
>Izhod
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 za strukture
The typedef ključna beseda se uporablja za definiranje vzdevka za že obstoječi podatkovni tip. V strukturah moramo poleg imena strukture uporabiti ključno besedo struct za definiranje spremenljivk. Včasih to poveča dolžino in kompleksnost kode. Typedef lahko uporabimo za določitev novega krajšega imena za strukturo.
Primer
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;> }> |
>
>Izhod
var1.a = 20 var2.x = 314>
Ugnezdene strukture
Jezik C nam omogoča vstavljanje ene strukture v drugo kot člana. Ta proces se imenuje gnezdenje in takšne strukture imenujemo ugnezdene strukture. Obstajata dva načina, na katera lahko ugnezdimo eno strukturo v drugo:
1. Gnezdenje vgrajene strukture
Pri tej metodi je struktura, ki jo ugnezdimo, deklarirana tudi znotraj nadrejene strukture.
Primer
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }> 2. Ločeno gnezdenje strukture
Pri tej metodi sta dve strukturi deklarirani ločeno, nato pa je struktura člana ugnezdena znotraj nadrejene strukture.
Primer
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }> Tu je treba opozoriti na to, da mora biti deklaracija strukture vedno prisotna pred njeno definicijo kot člana strukture. Na primer, spodnja izjava je neveljavna ker struktura mem ni definirana, ko je deklarirana znotraj nadrejene strukture.
struct parent { struct mem a; }; struct mem { int var; };> Dostop do ugnezdenih članov
Do ugnezdenih članov lahko dostopamo tako, da dvakrat uporabimo isti ( . ) operator pike, kot je prikazano:
str_parent.str_child .member;>
Primer gnezdenja strukture
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;> }> |
>
>Izhod
var1.a = 25 var1.b.x = 195 var1.b.c = A>
Kazalec strukture v C
Definiramo lahko kazalec, ki kaže na strukturo kot katera koli druga spremenljivka. Takšni kazalci se običajno imenujejo Kazalci strukture . Do članov strukture, na katere kaže kazalec strukture, lahko dostopamo z uporabo ( -> ) puščični operator.
Primer kazalca strukture
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;> }> |
>
>Izhod
1 2>
Samoreferenčne strukture
Samoreferenčne strukture v C so tiste strukture, ki vsebujejo sklice na isti tip kot same, tj. vsebujejo član kazalca tipa, ki kaže na isti tip strukture.
Primer samoreferenčnih struktur
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->naslednji->mem1,> >ptr1->naslednji->mem2);> > >return> 0;> }> |
>
primerek v Javi
>Izhod
var2.mem1: 10 var2.mem2: 20>
Takšne vrste struktur se uporabljajo v različnih podatkovnih strukturah, na primer za definiranje vozlišč povezanih seznamov, dreves itd.
C Struktura Oblazinjenje in pakiranje
Tehnično bi morala biti velikost strukture v C vsota velikosti njenih članov. Toda v večini primerov morda ne drži. Razlog za to je oblazinjenje strukture.
Oblazinjenje strukture je koncept dodajanja več praznih bajtov v strukturo za naravno poravnavo podatkovnih članov v pomnilniku. To je narejeno za zmanjšanje ciklov branja CPE za pridobivanje različnih članov podatkov v strukturi.
V nekaterih situacijah moramo strukturo tesno zapakirati z odstranitvijo praznih bajtov. V takih primerih uporabljamo Pakiranje strukture. Jezik C ponuja dva načina za pakiranje strukture:
- Uporaba #pragma pack(1)
- Uporaba __attribute((packed))__
Primer oblazinjenja in pakiranja strukture
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;> }> |
>
>Izhod
Size of str1: 8 Size of str2: 5>
Kot lahko vidimo, se velikost strukture spreminja, ko se izvaja pakiranje strukture.
Če želite izvedeti več o oblazinjenju in pakiranju strukture, glejte ta članek – Bitna polja se uporabljajo za določanje dolžine členov strukture v bitih. Ko poznamo največjo dolžino člana, lahko uporabimo bitna polja za določitev velikosti in zmanjšanje porabe pomnilnika.
Sintaksa bitnih polj
struct structure_name { data_type member_name : width_of_bit-field; };> Primer bitnih polj
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;> }> |
>
>Izhod
Size of Str1: 8 Size of Str2: 4>
Kot lahko vidimo, se velikost strukture zmanjša pri uporabi bitnega polja za definiranje največje velikosti člana 'a'.
Uporaba strukture v C
Strukture C se uporabljajo za naslednje:
- Strukturo je mogoče uporabiti za definiranje tipov podatkov po meri, ki jih je mogoče uporabiti za ustvarjanje nekaterih kompleksnih tipov podatkov, kot so datumi, čas, kompleksna števila itd., ki niso prisotni v jeziku.
- Lahko se uporablja tudi pri organizaciji podatkov, kjer je mogoče shraniti veliko količino podatkov v različnih poljih.
- Strukture se uporabljajo za ustvarjanje podatkovnih struktur, kot so drevesa, povezani seznami itd.
- Uporabljajo se lahko tudi za vračanje več vrednosti iz funkcije.
Omejitve C struktur
V jeziku C strukture zagotavljajo metodo za pakiranje podatkov različnih vrst. Struktura je uporabno orodje za obdelavo skupine logično povezanih podatkovnih elementov. Vendar imajo strukture C tudi nekatere omejitve.
- Večja poraba pomnilnika: To je posledica oblazinjenja strukture. Brez skrivanja podatkov: Strukture C ne dovoljujejo skrivanja podatkov. Do članov strukture lahko dostopate s katero koli funkcijo, kjer koli v obsegu strukture. Funkcije znotraj strukture: strukture C ne dovoljujejo funkcij znotraj strukture, zato ne moremo zagotoviti povezanih funkcij. Statični členi: Struktura C ne more imeti statičnih členov znotraj svojega telesa. Ustvarjanje konstrukcije v strukturi: Strukture v C ne morejo imeti konstruktorja znotraj struktur.
povezani članki
- Strukture C proti strukturi C++
