A struktúra deklarációja
A struktúra típus létrehozásakor használt általános forma az alábbi:
struct struktúratípus {
típus1 tag1; típus2 tag2;
. . . típusN tagN;
};
Példa:
struct THallgato {
int kora;char* neve;
char ferfi;char[10] szuletes;
}
Struktúra típusú változók deklarációja
Amennyiben deklaráltunk egy struktúra típust, úgy tudunk az adott struktúrából változót (példány) létrehozni:
struct THallgato {
int kora;
char* neve;
char ferfi;
char szuletes[10];
};
esetén:
struct THallgato Pisti;
A változó deklarálásakor újra ki kell írni a struct szót, és a struktúra típus nevét.
Struktúra típusú változók használata
Amennyiben deklaráltunk egy struktúra típusút, úgy tudunk az adott struktúrából változót (példány) létrehozni:
struct THallgato Pisti;
A „Pisti” nevű változó egyszerre tartalmazza a megadott struktúra összes mezőjét. Ugyanakkor jellemzően egyszerre csak egy mezővel dolgozunk. Ennek során meg kell adni a mező nevét, a változó neve után ponttal:
Pisti.kora = 20;
Pisti.ferfi = 1; // 1 azt jelenti: TRUE
Struktúrára mutató változó deklarációja
Amennyiben deklaráltunk egy struktúra típusút, úgy tudunk az adott struktúrára mutató (cím típusú) változót (példány) létrehozni:
struct THallgato *Pisti;
A „Pisti” változó egyelőre csak egy memóriacímet tartalmaz, amely memóriacímen majd egy ilyen struktúra fog elhelyezkedni. Egy ilyen ”Pisti”, mint minden cím típusú változó, első körben csak 4 B-ot foglal el.
Struktúrára mutató változó helyfoglalása
Amennyiben deklaráltunk egy struktúra típusút, úgy tudunk az adott struktúrára mutató (cím típusú) változót (példány) létrehozni:
struct THallgato *Pisti;
Egy ilyen változónak helyet kell foglalni a szokásos malloc foglaló függvénnyel. A struct esetén szinte kötelező a sizeof használata a memóriaigény meghatározásához, mivel egyrészt bonyolult a számítási mechanizmus, másrészt a memóriaterületek kihasználása a struct esetén megvalósításban is különbözőek, ezért igazából csak a fordítóprogram „tudja” azt eldönteni, hogy hány B-ra van szükség!
Pisti = (struct THallgato*) malloc( sizeof(struct THallgato*) );
Struktúrára mutató változó használata I
Amennyiben van egy struktúrára mutató változónk (példány), akkor a mezőire való hivatkozás során a szokásos * operátort kell használni:
struct THallgato *Pisti;
Pisti = (struct THallgato*) malloc( sizeof(struct THallgato*) );
(*Pisti).kora = 20;
Helytelen lenne a
*Pisti.kora = 20;
forma, mivel ebben az értékadó utasításban a bal oldalon két operátor is van (a * és a . ), és ilyenkor mindig szóba kerül az operátorok precedenciája.
A kifejezés csak akkor működik jól, ha előbb kerül kiértékelésre a „* operátor” (a címfeloldás), majd a kapott struktúrára kiértékelődik a „ . operátor”. Fordítva nem működik, mivel a Pisti változónak nincsenek mezői.
Sajnos azonban a pont operátor precedenciája a magasabb, így a zárójelezés kötelező!
Struktúrára mutató változó használata II
Amennyiben van egy struktúrára mutató változónk (példány), akkor a mezőire való hivatkozás során a szokásos * operátort kell használni, vagy használható a nyíl operátor is (->).
struct THallgato *Pisti;
Pisti = ( struct THallgato*) malloc( sizeof(struct THallgato*) );
Pisti->kora = 20;
Struktúrára mutató változók esetén a nyíl operátor használatos, mivel a * operátor használata szépséghibás a kötelező zárójelezés miatt. A fenti példa ekvivalens az alábbi sorral:
(*Pisti).kora = 20;
Struktúrára mutató változó felszabadítása
Amennyiben van egy struktúrára mutató változónk (példány), akkor a malloc-al történő memóriafoglalás után tudjuk a mezőket tényleges adattárolásra használni. Amennyiben már nincs szükségünk a struktúra-példányra, úgy a free segítségével tudjuk a feleslegessé vált memóriaterületet felszabadítani:
struct THallgato *Pisti;
Pisti = (struct THallgato*) malloc( sizeof(struct THallgato*) );
......
free(Pisti);
A rekord egy olyan összetett adatszerkezet, mely inhomogén, folytonos reprezentációjú, véletlen elérésű (random access).
A rekord mezőkből épül fel, melyek mindegyike különböző típusú is lehet. A mezők típusa általában valamilyen egyszerű típus (int, double, stb.) de semmi akadálya annak, hogy a rekord valamely mezője pl. egy már deklarált struktúra legyen. A mezőknek egyedi nevük van.
Első lépésben a rekordot, mint típust kell létrehoznunk, leírva azt, hogy milyen mezőkből épül fel, felsorolván a mezők típusait és neveit. Ennek az egész rekord típusnak adni kell egy azonosító nevet (a típus nevét).
Később ezen típusnév felhasználásával tudunk rekord típusú változókat vagy akár ilyen típusú tömböket is létrehozni.
Egyetlen ilyen rekord típusú változó egyszerre több adatot is képes tárolni a mezőiben. Egyszerre egy mezővel szoktunk dolgozni.