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 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:
- Tehtäväoperaattorin käyttö.
- Alustusluettelon käyttäminen.
- 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:
- #pragma-paketin käyttäminen(1)
- 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:
- 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ä.
- Sitä voidaan käyttää myös tiedon organisoinnissa, jossa eri kenttiin voidaan tallentaa suuri määrä tietoa.
- Rakenteita käytetään luomaan tietorakenteita, kuten puita, linkitettyjä listoja jne.
- 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
