logo

C Konstrukcijos

C struktūra yra vartotojo apibrėžtas duomenų tipas, kurį galima naudoti norint sugrupuoti įvairių tipų elementus į vieną tipą. The struktūrinis raktinis žodis naudojamas C programavimo kalbos struktūrai apibrėžti. Elementai struktūroje vadinami jos narys ir jie gali būti bet kokio galiojančio duomenų tipo.

C Konstrukcijos

C Struktūros deklaracija

Turime deklaruoti struktūrą C prieš naudodami ją savo programoje. Struktūros deklaracijoje nurodome jos narių kintamuosius kartu su jų duomenų tipu. Mes galime naudoti raktinį žodį struct, norėdami deklaruoti struktūrą C, naudodami šią sintaksę:



Sintaksė

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

Aukščiau pateikta sintaksė taip pat vadinama struktūros šablonu arba struktūros prototipu ir deklaracijoje struktūrai neskiriama jokia atmintis.

C struktūros apibrėžimas

Norėdami naudoti struktūrą savo programoje, turime apibrėžti jos egzempliorių. Tai galime padaryti kurdami struktūros tipo kintamuosius. Struktūros kintamuosius galime apibrėžti dviem būdais:

1. Struktūros kintamojo deklaracija su struktūros šablonu

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

2. Struktūros kintamojo deklaracija po struktūros šablono

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

Prieigos struktūros nariai

Mes galime pasiekti struktūros narius naudodami ( . ) taško operatorius.



Sintaksė

structure_name.member1; strcuture_name.member2;>

Tuo atveju, kai turime rodyklę į struktūrą, nariams pasiekti taip pat galime naudoti rodyklės operatorių.

Inicijuoti struktūros narius

Struktūros nariai negali būti inicijuojamas su deklaracija. Pavyzdžiui, ši C programa nepavyksta kompiliuojant.

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

Aukščiau pateiktos klaidos priežastis yra paprasta. Kai deklaruojamas duomenų tipas, jam neskiriama atmintis. Atmintis paskirstoma tik tada, kai sukuriami kintamieji.



Mes galime inicijuoti struktūros narius 3 būdais, kurie yra tokie:

  1. Naudojant priskyrimo operatorių.
  2. Initializatorių sąrašo naudojimas.
  3. Paskirto inicijavimo sąrašo naudojimas.

1. Inicijavimas naudojant priskyrimo operatorių

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

2. Inicijavimas naudojant inicijavimo sąrašą

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

Šio tipo inicijavimo atveju reikšmės priskiriamos nuoseklia tvarka, kaip jos deklaruojamos struktūros šablone.

3. Inicijuoti naudojant paskirtąjį inicijavimo sąrašą

Paskirtasis inicijavimas leidžia struktūros elementus inicijuoti bet kokia tvarka. Ši funkcija buvo įtraukta į C99 standartą.

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

Paskirtasis inicijavimas palaikomas tik C, bet ne C++.

C struktūros pavyzdys

Šioje C programoje parodyta, kaip naudoti struktūras

C


java komentarai



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

>

>

Išvestis

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 struktūroms

The typedef raktinis žodis naudojamas apibrėžti jau esamo duomenų tipo slapyvardį. Struktūrose kintamiesiems apibrėžti turime naudoti raktinį žodį struct kartu su struktūros pavadinimu. Kartais tai padidina kodo ilgį ir sudėtingumą. Galime naudoti typedef norėdami apibrėžti kokį nors naują trumpesnį struktūros pavadinimą.

Pavyzdys

C




Linux gamintojas

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

>

>

Išvestis

var1.a = 20 var2.x = 314>

Įdėtos struktūros

C kalba leidžia įterpti vieną struktūrą į kitą kaip narį. Šis procesas vadinamas lizdu, o tokios struktūros vadinamos įdėtomis struktūromis. Yra du būdai, kaip galime sujungti vieną struktūrą į kitą:

1. Įterptųjų struktūrų įdėjimas

Taikant šį metodą, įdėta struktūra taip pat deklaruojama pagrindinėje struktūroje.

Pavyzdys

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

2. Atskiras struktūrinis lizdas

Taikant šį metodą, dvi struktūros deklaruojamos atskirai, o tada narių struktūra įdedama į pirminę struktūrą.

Pavyzdys

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

Vienas dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad struktūros deklaracija visada turi būti pateikta prieš jos apibrėžimą kaip struktūros elementą. Pavyzdžiui, žemiau pateikta deklaracija negalioja nes struktūros mem neapibrėžiamas, kai jis deklaruojamas pagrindinėje struktūroje.

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

Prieiga prie įdėtųjų narių

Įdėtus narius galime pasiekti naudodami tą patį (. ) taško operatorių du kartus, kaip parodyta:

 str_parent.str_child .member;>

Struktūros įdėjimo pavyzdys

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

>

>

Išvestis

var1.a = 25 var1.b.x = 195 var1.b.c = A>

Struktūros rodyklė C

Galime apibrėžti rodyklę, kuri nurodo struktūrą, kaip ir bet kurį kitą kintamąjį. Tokios rodyklės paprastai vadinamos Struktūros rodyklės . Mes galime pasiekti struktūros narius, nurodytus struktūros žymekliu, naudodami ( -> ) rodyklės operatorius.

Struktūros rodyklės pavyzdys

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

>

>

Išvestis

javascript kelių eilučių eilutė
1 2>

Savireferencinės struktūros

Į save nukreipiančios struktūros C yra tos struktūros, kuriose yra nuorodų į tą patį tipą kaip ir pačios, t. y. jose yra tipo rodyklės narys, nukreipiantis į tą patį struktūros tipą.

Savireferencinių struktūrų pavyzdys

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

>

>

Išvestis

var2.mem1: 10 var2.mem2: 20>

Tokios struktūros naudojamos įvairiose duomenų struktūrose, pavyzdžiui, norint apibrėžti susietų sąrašų mazgus, medžius ir kt.

C Struktūra Paminkštinimas ir pakavimas

Techniškai konstrukcijos dydis C turėtų būti jos narių dydžių suma. Tačiau daugeliu atvejų tai gali būti netiesa. To priežastis yra Struktūrinis pamušalas.

Struktūrinis paminkštinimas yra kelių tuščių baitų įtraukimo į struktūrą koncepcija, siekiant natūraliai suderinti duomenų elementus atmintyje. Tai daroma siekiant sumažinti procesoriaus skaitymo ciklus, kad būtų galima gauti skirtingus struktūros duomenų elementus.

Kai kuriose situacijose turime sandariai supakuoti struktūrą pašalindami tuščius baitus. Tokiais atvejais naudojame Struktūrinis pakavimas. C kalba suteikia du struktūros pakavimo būdus:

  1. Naudojant #pragma paketą (1)
  2. Naudojant __attribute((packed))__

Struktūros užpildymo ir pakavimo pavyzdys

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

>

>

Išvestis

Size of str1: 8 Size of str2: 5>

Kaip matome, atliekant konstrukcijos pakavimą keičiasi konstrukcijos dydis.

Norėdami sužinoti daugiau apie struktūros užpildymą ir pakavimą, žr. šį straipsnį – Bitų laukai naudojami struktūros elementų ilgiui bitais nurodyti. Kai žinome maksimalų nario ilgį, galime naudoti bitų laukus, kad nurodytume dydį ir sumažintume atminties sąnaudas.

Bitų laukų sintaksė

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

Bitų laukų pavyzdys

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

>

pašalinti paskutinį simbolį iš eilutės

>

Išvestis

Size of Str1: 8 Size of Str2: 4>

Kaip matome, struktūros dydis sumažinamas naudojant bitų lauką maksimaliam nario „a“ dydžiui apibrėžti.

Struktūros panaudojimas C

C struktūros naudojamos šiems tikslams:

  1. Struktūra gali būti naudojama norint apibrėžti pasirinktinius duomenų tipus, kurie gali būti naudojami kuriant kai kuriuos sudėtingus duomenų tipus, pvz., datas, laiką, sudėtingus skaičius ir kt., kurių kalboje nėra.
  2. Jis taip pat gali būti naudojamas duomenų organizavime, kur gali būti saugomas didelis duomenų kiekis skirtinguose laukuose.
  3. Struktūros naudojamos kuriant duomenų struktūras, tokias kaip medžiai, susietieji sąrašai ir kt.
  4. Jie taip pat gali būti naudojami norint grąžinti kelias reikšmes iš funkcijos.

C struktūrų apribojimai

C kalboje struktūros suteikia metodą skirtingų tipų duomenims supakuoti. Struktūra yra naudingas įrankis tvarkyti logiškai susijusių duomenų elementų grupę. Tačiau C struktūros taip pat turi tam tikrų apribojimų.

    Didesnis atminties suvartojimas: Taip yra dėl struktūros užpildymo. Nėra duomenų slėpimo: C struktūros neleidžia slėpti duomenų. Struktūros elementus gali pasiekti bet kuri funkcija, bet kurioje struktūros apimtyje. Funkcijos struktūroje: C struktūros neleidžia funkcijų struktūroje, todėl negalime teikti susijusių funkcijų. Statiniai nariai: C Struktūros korpuse negali būti statinių narių. Konstrukcijos kūrimas Struktūroje: Struktūros C negali turėti konstruktoriaus struktūrų viduje.

susiję straipsniai

  • C struktūros prieš C++ struktūrą