logo

C Rakenteet

C:n rakenne on käyttäjän määrittämä tietotyyppi, jonka avulla voidaan ryhmitellä mahdollisesti erityyppisiä kohteita yhdeksi tyypiksi. The struct avainsana käytetään määrittämään rakenne C-ohjelmointikielessä. Rakenteen kohteita kutsutaan nimellä sen jäsen ja ne voivat olla mitä tahansa kelvollista tietotyyppiä.

C Rakenteet

C Rakenneilmoitus

Meidän on määritettävä rakenne C:ssä ennen kuin käytämme sitä ohjelmassamme. Rakenteen määrittelyssä määritämme sen jäsenmuuttujat tietotyypin kanssa. Voimme käyttää struct-avainsanaa rakenteen ilmoittamiseen C:ssä käyttämällä seuraavaa syntaksia:



Syntaksi

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

Yllä olevaa syntaksia kutsutaan myös rakennemalliksi tai rakenteen prototyypiksi, eikä rakenteelle ole varattu muistia ilmoituksessa.

C Rakenteen määritelmä

Jotta voimme käyttää rakennetta ohjelmassamme, meidän on määritettävä sen esiintymä. Voimme tehdä sen luomalla rakennetyypin muuttujia. Voimme määrittää rakennemuuttujat kahdella menetelmällä:

1. Rakennemuuttujan ilmoitus rakennemallilla

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

2. Rakennemuuttujan ilmoitus rakennemallin jälkeen

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

Pääsyrakenteen jäsenet

Voimme käyttää rakenteen jäseniä käyttämällä ( . ) pisteoperaattori.



Syntaksi

structure_name.member1; strcuture_name.member2;>

Siinä tapauksessa, että meillä on osoitin rakenteeseen, voimme käyttää jäseniä myös nuolioperaattorilla.

Alusta rakenteen jäsenet

Rakenteen jäsenet ei voi olla alustetaan ilmoituksella. Esimerkiksi seuraava C-ohjelma epäonnistuu käännöksessä.

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

Syy yllä olevaan virheeseen on yksinkertainen. Kun tietotyyppi on ilmoitettu, sille ei varata muistia. Muisti varataan vain, kun muuttujat luodaan.



Voimme alustaa rakenteen jäsenet kolmella tavalla, jotka ovat seuraavat:

  1. Tehtäväoperaattorin käyttö.
  2. Alustusluettelon käyttäminen.
  3. Määritetyn alustusluettelon käyttäminen.

1. Alustus Assignment Operatorilla

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

2. Alustus Initializer List -toiminnolla

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

Tämän tyyppisessä alustuksessa arvot määritetään peräkkäisessä järjestyksessä sellaisessa järjestyksessä kuin ne on ilmoitettu rakennemallissa.

3. Alustus käyttäen määritettyä alustusluetteloa

Määritetty alustus mahdollistaa rakenteen jäsenten alustamisen missä tahansa järjestyksessä. Tämä ominaisuus on lisätty C99 - standardiin .

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

Osoitettua alustusta tuetaan vain C:ssä, mutta ei C++:ssa.

Esimerkki C:n rakenteesta

Seuraava C-ohjelma näyttää kuinka rakenteita käytetään

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

>

>

Lähtö

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 rakenteille

The typedef avainsanaa käytetään määrittämään alias jo olemassa olevalle tietotyypille. Rakenteissa meidän on käytettävä struct-avainsanaa rakenteen nimen kanssa muuttujien määrittämiseen. Joskus tämä lisää koodin pituutta ja monimutkaisuutta. Voimme käyttää typedef:iä määrittämään rakenteelle uuden lyhyemmän nimen.

Esimerkki

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

>

>

Lähtö

var1.a = 20 var2.x = 314>

Sisäkkäiset rakenteet

C-kielen avulla voimme lisätä yhden rakenteen toiseen jäseneksi. Tätä prosessia kutsutaan sisäkkäisiksi rakenteiksi, ja tällaisia ​​rakenteita kutsutaan sisäkkäisiksi rakenteiksi. On kaksi tapaa, joilla voimme upottaa yhden rakenteen toiseen:

1. Upotettu rakenne sisäkkäin

Tässä menetelmässä sisäkkäinen rakenne ilmoitetaan myös päärakenteen sisällä.

Esimerkki

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

2. Erillinen rakenne sisäkkäin

Tässä menetelmässä kaksi rakennetta ilmoitetaan erikseen ja sitten jäsenrakenne on sisäkkäinen päärakenteen sisään.

yritä saada java kiinni

Esimerkki

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

Tässä on huomioitava se, että rakenteen ilmoituksen tulee aina olla läsnä ennen sen määrittelyä rakenteen jäseneksi. Esimerkiksi, alla oleva ilmoitus on virheellinen koska struct mem ei ole määritelty, kun se ilmoitetaan päärakenteen sisällä.

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

Sisäkkäisten jäsenten käyttö

Voimme käyttää sisäkkäisiä jäseniä käyttämällä samaa (. ) pisteoperaattoria kahdesti kuvan mukaisesti:

 str_parent.str_child .member;>

Esimerkki rakenteen sisäkkäisestä

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

>

>

Lähtö

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

Rakenneosoitin C:ssä

Voimme määritellä osoittimen, joka osoittaa rakenteeseen kuten mikä tahansa muu muuttuja. Tällaisia ​​osoittimia kutsutaan yleensä Rakenneosoittimet . Voimme käyttää rakenneosoittimen osoittamia rakenteen jäseniä käyttämällä ( -> ) nuolioperaattori.

Esimerkki rakenneosoittimesta

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

>

>

Lähtö

1 2>

Itseviittausrakenteet

C:n itseviittausrakenteet ovat sellaisia ​​rakenteita, jotka sisältävät viittauksia samaan tyyppiin kuin itse, eli ne sisältävät tyyppiosoittimen jäsenen, joka osoittaa samaan rakennetyyppiin.

Esimerkki itseviittausrakenteista

 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->seuraava->mem2);>> >return> 0;> }>

>

>

Lähtö

var2.mem1: 10 var2.mem2: 20>

Tällaisia ​​rakenteita käytetään erilaisissa tietorakenteissa, kuten linkitettyjen listojen, puiden jne. solmujen määrittämiseen.

C Rakenne pehmuste ja pakkaus

Teknisesti C-rakenteen koon tulisi olla sen jäsenten kokojen summa. Mutta se ei välttämättä ole totta useimmissa tapauksissa. Syynä tähän on rakennepehmuste.

Rakennepehmuste on ajatus useiden tyhjien tavujen lisäämisestä rakenteeseen, jotta muistin datajäsenet kohdistetaan luonnollisesti. Se tehdään CPU:n lukujaksojen minimoimiseksi rakenteen eri dataosien hakemiseksi.

Joissakin tilanteissa meidän on pakattava rakenne tiukasti poistamalla tyhjät tavut. Tällaisissa tapauksissa käytämme Rakennepakkaus. C-kieli tarjoaa kaksi tapaa rakenteen pakkaamiseen:

  1. #pragma-paketin käyttäminen(1)
  2. Käyttämällä __attribute((pakattu))__

Esimerkki rakenteen pehmusteesta ja pakkaamisesta

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

>

>

Lähtö

Size of str1: 8 Size of str2: 5>

Kuten näemme, rakenteen koko vaihtelee rakennepakkauksen yhteydessä.

Lisätietoja rakenteen täyttämisestä ja pakkaamisesta on tässä artikkelissa – Bittikenttiä käytetään määrittämään rakenneosien pituus bitteinä. Kun tiedämme jäsenen enimmäispituuden, voimme käyttää bittikenttiä koon määrittämiseen ja muistin kulutuksen vähentämiseen.

Bittikenttien syntaksi

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

Esimerkki bittikentistä

C




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

>

>

Lähtö

Size of Str1: 8 Size of Str2: 4>

Kuten näemme, rakenteen koko pienenee, kun bittikenttää käytetään jäsenen 'a' enimmäiskoon määrittämiseen.

Rakenteen käyttö C:ssä

C-rakenteita käytetään seuraaviin:

  1. Rakenteen avulla voidaan määrittää mukautetut tietotyypit, joita voidaan käyttää joidenkin monimutkaisten tietotyyppien luomiseen, kuten päivämäärät, kellonaika, kompleksiluvut jne., joita ei ole kielessä.
  2. Sitä voidaan käyttää myös tiedon organisoinnissa, jossa eri kenttiin voidaan tallentaa suuri määrä tietoa.
  3. Rakenteita käytetään luomaan tietorakenteita, kuten puita, linkitettyjä listoja jne.
  4. Niitä voidaan käyttää myös useiden arvojen palauttamiseen funktiosta.

C-rakenteiden rajoitukset

C-kielessä rakenteet tarjoavat menetelmän erityyppisten tietojen pakkaamiseen. Rakenne on hyödyllinen työkalu loogisesti liittyvien tietokohteiden ryhmän käsittelemiseen. C-rakenteilla on kuitenkin myös joitain rajoituksia.

    Suurempi muistinkulutus: Se johtuu rakenteen pehmusteesta. Ei tietojen piilottamista: C-rakenteet eivät salli tietojen piilottamista. Rakenteen jäseniä voidaan käyttää millä tahansa toiminnolla, missä tahansa rakenteen alueella. Toiminnot rakenteen sisällä: C-rakenteet eivät salli toimintoja rakenteen sisällä, joten emme voi tarjota niihin liittyviä toimintoja. Staattiset jäsenet: C Rakenteessa ei voi olla staattisia jäseniä sen rungossa. Rakenteiden luominen Structuressa: C:n rakenteilla ei voi olla rakentajaa rakenteissa.

Aiheeseen liittyvät artikkelit

  • C-rakenteet vs. C++-rakenne