next up previous contents
Elõre: Hivatkozás struktúra elemekre Fel: Struktúrák és unionok Vissza: Struktúrák és unionok

Struktúrák megadása

A struktúramegadás formailag nagyon hasonlít az enum típusú deklarációkra, alakja:

tárolási osztály struct típuscímke

             {

                típus_1  azonosítólista_1;

                típus_2  azonosítólista_2;

                ...

             } azonosítólista;

Az enum deklarációhoz hasonlóan elmaradhat a típuscímke (a struktúra megnevezése), ha a késõbbiekben nem kívánunk hivatkozni rá, illetve elmaradhat az azonosítólista is, ha csak a struktúra alakját kívánjuk megadni. A struktúrát felépítõ elemek, a mezõk ( members) deklarálása típusuk és nevük megadásával történik. A típuscímke tipikus alkalmazása az önhivatkozó (rekurzív) adatstruktúrák definiálása. Példa struktúra megadására:

            struct s1 {
                        int       a, b;
                        float     f;
                        char      *s, nev[30];
                        struct s1 *link;
                      } sv, *s1h;
amely az s1 struktúra alakjának rögzítése mellett definiál két - a definíció elhelyezésétõl függõen - globális vagy auto változót, az egyiket mint a fenti struktúrának megfelelõ tárolási egységet, a másikat, mint egy ilyen típusú tárolási egységet megcímzõ mutatót. A struktúrát felépítõ mezõk típusa tetszõleges lehet, így bármely struktúra tartalmazhat újabb struktúrákat is (ezt beágyazásnak, angolul nesting-nek nevezzük); az egyetlen megkötés, hogy egy adott struktúrán belül elhelyezkedõ elem típusa sem lehet a deklarálás alatt levõ típus, azaz semelyik struktúra sem tartalmazhatja önmagát saját elemeként. Lehetõség van viszont arra (amint az elõbbi példában is látható), hogy a struktúra tartalmazzon mutatót olyan tárolási egységre, amelynek típusa az adott struktúra (lehetõség listák, fák és egyéb rekurzív adatstruktúrák kialakítására). A korszerû C implementációk - így a BORLAND C++ is - megengedik, hogy egy struktúraelem azonosítója megegyezzék valamely egyéb, más programegység azonosítójával, hiszen a mezõkre való hivatkozás - mint ahogy rögtön látni fogjuk - mindig egyértelmûen megadja a megfelelõ struktúrát is, így a két azonosító használata jól elkülöníthetõ. Ennek megfelelõen lehet két különbözõ struktúrának is azonos nevû mezõje. A struktúra típusú elemekbõl álló egydimenziós tömbök definiálása hasonlóan történik, mint az elemi típusokból való építkezés esetén:
            stuct s1 s1_tomb[12];
A változódefiníciók struktúrák esetén szintén tartalmazhatnak kezdõértékadást is. A C nyelvben minden aggregátum inicializátorát - mint azt az egydimenziós tömböknél láttuk - a { } zárójelpár közé zárt listával kell megadni:
            struct tanulo{
                           char nev[30];
                           short jegy;
                         } osztaly[ ] = 
                         {
                           { "Nyilas Misi",  5 },
                           { "Pato Pali",    2 },
                               ...
                           { "Bolond Istok", 1 }
                         };
A definiálandó struktúratömb méretét nem explicit módon írtuk elõ, hanem az inicializáló elemek számával. A tömb kezdõértékét { } zárójelpár között levõ listával adtuk meg - minden listaelem egy struktúra kezdõértékét határozza meg. Ezen aggregátumok inicializálása szintén { } közé zárt - kételemû - listákkal történik. Mivel karaktertömb alkotja a struktúra elsõ mezõjét, ezért itt egyszerûsített megadást is használhattunk, sztringkonstans inicializátort alkalmazva. A második mezõ már nem aggregátum, ezért használhattunk az a kezdõértékadásban közönséges konstansokat.


next up previous contents
Elõre: Hivatkozás struktúra elemekre Fel: Struktúrák és unionok Vissza: Struktúrák és unionok