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.