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
[email protected]
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) Mindig fel kell szabadítani a lefoglalt megmóriát!
Indexelés 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