Programozás I. - 9. gyakorlat Mutatók, dinamikus memóriakezelés Tar Péter 1 Pannon Egyetem M szaki Informatikai Kar Rendszer- és Számítástudományi Tanszék Utolsó frissítés: November 9, 2009 1 tar@dcs.vein.hu Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 1 / 1
Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 2 / 1
Mutatók - ismétlés Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 3 / 1
Mutatók (Pointerek) Deníció A mutatók olyan változók, melyek más változók, vagy objektumok címét tárolják. Jellemz i Hossza 4 bájt (Ekkora egy memóriacím) Használatához az indirekció operátora (*) szükséges A memóriában bármire mutathat A NULL érték logikailag hamisat jelent. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 4 / 1
Mutatók és mutatott értékek Mutató értéke A mutató értéke egy memóriacím. Mutatott érték A mutatott értéket a mutató típusa alapján a * operátorral olvashatjuk ki. Az eredmény a mutató értékében tárolt memóriacímen lév adat értéke lesz. Mutatók értékadása A mutatók értékeként bármely változó címét megadhatjuk a & operátor segítségével. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 5 / 1
Többszörös indirekció A mutató is egy változó, az is egy memóriacímen helyezkedik el, így annak a címére is hivatkozhatunk egy mutatóval. Szintaxis int x=1; int* px=&x; int** ppx=&px; Tulajdonságai Az indirekció tetsz leges mélységig növelhet A mutatott értékre való hivatkozásnál minden * operátor egyel csökkenti az indirekció mélységét Használata: pl.: Több dimenziós tömbök kezelése Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 6 / 1
Függvények Paraméter átadási módok Érték szerinti paraméterátadás - A paraméterek értékei lemásolódnak Cím szerinti paraméterátadás - A paraméterek mutatók! Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 7 / 1
Cím szerinti paraméterátadás Tulajdonságok Az indirekció segítségével megcímezhetünk változókat Helyes használat esetén módosíthatjuk a függvényen kívüli változók értékeit Eddig visszatérési értékként egy értéket tudtunk csak adni, ez most is igaz, de a függvény több küls változóra is hatást gyakorolhat. Figyelni kell rá, hogy mindig memóriacímet adjunk át, ha cím szerinti paraméterátadást szeretnénk használni. Ellen rizzük hogy a mutató értékünk nem NULL-e, egyébként hibát kaphatunk. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 8 / 1
Dinamikus változók Deníció Olyan változó, amely tárolásához szükséges helyet futás közben foglaljuk le, és azt mutató segítségével érjük el. Használatuk Nagy méret tömbök és rekordok esetén: hasznos Azokban az esetekben, amikor futási id ben derül ki, hogy mekkora helyre lesz szükségünk: szükséges A már nem használt, lefoglalt megmóriaterületeket fel kell szabadítani, és a mutatójukat le kell nullázni! Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 9 / 1
Terület lefoglalása és felszabadítása Foglalás Általánosan: void* malloc(int byteokszama); Konkrét esetben: int* p; p=(int*)malloc(10*sizeof(int)); Ellen rizzük hogy sikerült-e a foglalás: if (p!=null) Felszabadítás free(p); p=null; Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 10 / 1
Dinamikus tömbök Jellemz k Foglalásuk malloc-al történik Elegend futási id ben megtudni a tömb méretét A statikus tömb címe egy mutató A dinamikus tömb címe a tömbre mutató mutatónak a címe A statikus többdimenziós tömb sorfolytonasan tárolt A dinamikus többdimenziós tömb többszörös indirekciót használ (általában) Indexelés Mindig fel kell szabadítani a lefoglalt megmóriát! Legyen egy 4*5-ös mátrixunk, ekkor: Statikus tömb esetén: M[2][3]==*(M+2*5+3); Dinamikus tömb esetén: M[2][3]==*(*(M+2)+3); Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 11 / 1
Konstans mutatók A mutató értéke konstans int const *p; A mutatott érték nem változtatható *p=2; hiba aa mutatott érték konstans int* const p; A mutató nem változtatható p=null; hiba Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 12 / 1
Egyéb memóriakezel utasítások void* calloc(int elemszam,int elemmeret) A lefoglalt terültetet nullákkal inicializálja void memcpy(void* dest, void* src, int meret) Memóriában másol src-r l dest-re A memory.h betöltése szükséges void memset(void* dest, char c, int meret) Memóriában ír dest-re A feltöltött terültet c karakterrel tölti ki A memory.h betöltése szükséges Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 13 / 1
1 Minden pontot külön valósíts meg és szabadítsd fel mindíg a memóriát! Hozz létre egy 10 elem tömböt, töltsük fel és írjuk ki az elemeket Foglald le a tömböt dinamikusan Tedd meg ugyanezt egy 'n' méret tömbbel Tedd meg ugyanezt egy 'n'x'm' méret tömbbel 2 Kérjünk be egy 5x5-ös tömböt Készítsünk csere függvényt, amely megcserél két elemet Rendezzük soronként az elemeit Írjuk ki az egyes oszlopokban az elemek maximumát Használjunk cím szerinti paraméterátadást, ahol lehetséges 3 Kérjünk be két egész számot 1 és 10 között, legyenek A és B. Készítsünk AxB méret, dinamikus szorzótáblát. Ehhez kérjük be a szükséges mennyiség számot. Írjuk ki az eredményt. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 9, 2009 14 / 1