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 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.
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);>> |