8. gyakorlat Pointerek, dinamikus memóriakezelés

Hasonló dokumentumok
10. gyakorlat. Pointerek Tárolási osztályok

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

10. gyakorlat Struktúrák, uniók, típusdefiníciók

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás alapjai. 10. előadás

Programozás I gyakorlat. 10. Stringek, mutatók

Mutatók és mutató-aritmetika C-ben március 19.

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

A C programozási nyelv III. Pointerek és tömbök.

A C programozási nyelv III. Pointerek és tömbök.

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

1. Alapok. Programozás II

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozas 1. Strukturak, mutatok

Programozás I gyakorlat

7. fejezet: Mutatók és tömbök

7. gyakorlat Sorozatok, Fájlkezelés

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Programozási Nyelvek: C++

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Készítette: Nagy Tibor István

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

5. Gyakorlat. struct diak {

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Dinamikus mátrixok. Dinamikus többdimenziós tömbök

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

OOP #14 (referencia-elv)

3. Osztályok II. Programozás II

Programozási nyelvek Java

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Programozás II. 4. Dr. Iványi Péter

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás alapjai 9.Gy: Struktúra 2.

Bevezetés a C++ programozási nyelvbe

Programozás C++ -ban

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Programozási nyelvek Java

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Programozási nyelvek Java

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Objektumorientált Programozás V.

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Objektumorientált Programozás VI.

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Pénzügyi algoritmusok

10. gyakorlat Tömb, mint függvény argumentum

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Objektum Orientált Programozás V.

Pointerek C-ben, C++-ban

Felvételi tematika INFORMATIKA

Beágyazott rendszerek fejlesztése laboratórium DSP fejlesztési technológiák

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 31. Széchenyi István Egyetem, Gy r

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Adatszerkezetek I. 1. előadás

Programozás alapjai. 7. előadás

5. gyakorlat. Konstansok Tömbök Stringek

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Tájékoztató. Használható segédeszköz: -

C++ programozási nyelv

Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök Gyakorló feladatok V 1.0 ÓE-NIK-AII,

C++ programozási nyelv Konstruktorok-destruktorok

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Algoritmusok és adatszerkezetek I. 1. előadás

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Occam 1. Készítette: Szabó Éva

Maximum kiválasztás tömbben

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Java II. I A Java programozási nyelv alapelemei

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

A C++ Standard Template Library rövid összefoglalás

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Hatékony memóriakezelési technikák. Smidla József Operációkutatási Laboratórium január 16.

Adatszerkezetek 1. Dr. Iványi Péter

INFORMATIKA javítókulcs 2016

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Programozás II. segédlet

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Programozás alapjai II. (7. ea) C++

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Programozás II gyakorlat. 6. Polimorfizmus

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Programozás I gyakorlat

Átírás:

8. gyakorlat Pointerek, dinamikus memóriakezelés

Házi ellenőrzés Egy számtani sorozat első két tagja A1 és A2. Számítsa ki a sorozat N- dik tagját! (f0051) Egy mértani sorozat első két tagja A1 és A2. Számítsa ki a sorozat N-dik tagját! (f0053)

Házi ellenőrzés (f0121) Írj egy programot ami kiírja 1-től 12-ig az n! értékét! Kétféle algoritmust készíts! Az elsőben egy külön függvény számítsa ki n! értékét, majd ezt felhasználva a főprogramból írasd ki a megfelelő értékeket. A másik verzióban optimalizáld a programot, és egyetlen ciklus segítségével oldd meg a feladatot!

Feladat (f0215) Futtasd le a cim.c programot, és értelmezd! Melyik érték melyik értékkel egyenlő, és miért?

Pointer A programunk által használt adatok (sőt, maga a program is) a memória egy bizonyos részén tárolódik Ezekre a program a memóriaterület kezdőcímével tud hivatkozni Lehetőségünk van arra, hogy mi is rámutassunk ezekre a lefoglalt területekre ezt pointerekkel tehetjük meg

Mi a pointer? Mutató, egy lefoglalt memóriaterületre mutat Az értéke a memóriaterület címe NEM azonos a memóriaterületen tárolt értékkel! (ld. példák) Létrehozás típus * név; int * p; A pointerekkel kapcsolatos függvények az stdlib.h header fájlban vannak

Pointer operátorok Létrehozás típus * név; int * pa; Hivatkozás feloldása (hová mutat?) *név *pa

Pointer operátorok Cím lekérdezése &név &a A pointer tekinthető egy változónak, ami egy memóriacímet tárol Tehát a pointernek is van egy címe Ez nem azonos azzal, ahova mutat

Feladat (f0216) Fordítsd és futtasd a csere.c programot. Ebben a programban a csere függvény elvileg megcseréli a main függvényben található x és y változó értékét, de valamiért nem működik. Javítsd ki a csere függvény (és a hozzá tartozó hívást) úgy, hogy valóban megcserélje a main két változójának értékét.

Paraméterátadási módok C-ben a függvényeknek a paramétereket két módon adhatjuk át Érték szerint eddig ezt használtuk Cím szerint már láttuk, közvetve

Érték szerinti paraméterátadás Ha meghívunk egy függvényt bizonyos paraméterekkel, akkor a függvényhez csak a paraméterekben tárolt értékek jutnak el A függvény indulásakor új memóriaterület foglalódik a paraméterek számára, ide bemásolódik a kapott érték Ez a paraméter úgy viselkedik, mint egy lokális változó, és csak a függvény végéig él

Cím szerinti átadás A memóriaterület címei abszolútak, tehát bárhol hivatkozunk rá, ugyan azt jelenti Ha a függvénynek nem az éréket adjuk át, hanem annak a változónak a címét, ahol az érték tárolódik, akkor a függvény látni fogja az eredeti memóriahelyet Ezáltal módosíthatjuk függvényből az eredeti értéket

Cím szerinti átadás C-ben Függvény paramétere pointer legyen void csere(int* a, int* b); Függvényen belül az a-t és b-t pointerként használjuk *a = *b; Híváskor ne a változó értékét, hanem annak címét adjuk át csere(&x, &y);

Feladat (f0214) Elemezd és futtasd a pointerek.c programot. Mi a különbség p, q, illetve *p és *q értéke között?

Pointer, dinamikus memória Pointerek használatával lehetőségünk van dinamikusan (futási időben) memóriaterületet foglalni adatok számára Ehhez szükséges függvények: malloc(meret); meret bájt nagyságú területet foglal le, és egy ide mutató, típus nélküli (void) pointert ad vissza

Pointer, dinamikus memória Ha nem tudjuk valaminek a pontos méretét, használhatjuk a sizeof operátort sizeof(int); Az dinamikusan foglalt memóriaterületet fel KELL szabadítani! Egy pointer által mutatott helyen található adatra a * (dereferencia) operátorral hivatkozhatunk (az előbb láttuk) *p = 5; p = 5; /*ez nem ugyan az!*/

Feladat (f0191) Egészítsd ki a malloc-free.c programot úgy, hogy a végrehajtása során ne keletkezzen futási hiba! A 4. sorban inicializáld a változókat! A 6. sorba szúrj be egy utasítást! A kettő közül melyik a helyes megoldás? A másik (önmagában) miért nem jó?

Memória felszabadítás Hagyományos módon lefoglalt memóriát nem szabad felszabadítani automatikus Dinamikusan foglalt memóriát fel kell szabadítani, más nem tudja helyettünk Egy memóriaterületet csak egyszer szabad felszabadítani Ha két pointer mutat ugyan oda, attól az még egy terület Felszabadítani a free() függvénnyel lehet, paraméterben a pointert kell átadni

Feladat (f0217) Nyisd meg a dintomb.c nevű programot, amelyben deklarálunk egy 10 elemű int tömböt és feltöltjük az elemeit a standard inputról, ezután kiíratjuk a tömb elemeit. Deklarálj egy int pointert is, és a beolvasást ennek segítségével valósítsd meg!

Feladat (f0217) Alakítsd át az előző programot úgy, hogy most az első tömbelem értéke előtt kérd be a tömb méretét (a beolvasandó elemek számát). Mi történik, ha 10-nél kisebb értéket, 10-et, 10-nél nem sokkal nagyobb értéket, illetve 10-nél sokkal nagyobb értéket adsz meg elemszámként?

Feladat (f0217) Ezután töröld a tömb deklarációját és az azonosítóját pointerként deklaráld! Az elemszám megadása után de a tömbelemek bekérése előtt dinamikusan foglalj helyet a tömb elemei számára (pontosan annyit, amennyi kell)! Most mi történik, ha tömbméretnek különböző értékeket adsz meg?

Pointerek és tömbök kapcsolata C-ben a tömbök és a pointerek hasonlóan viselkednek A tömb neve ~ pointer A tömb típusa ~ pointer típusa Annyi bájt helyet foglal neki a rendszer, amennyi szükséges az adott típusú, a [] jelek között megadott számú elemhez

Pointerek és tömbök kapcsolata C-ben a tömbök és a pointerek hasonlóan viselkednek A tömb neve a lefoglalt memóriaterület első elemére mutat Amikor a tömböt indexeljük, akkor hasonló ahhoz, mint amikor egy pointert tologatunk a memóriában (ezért 0 az első index, mert abban az esetben nem kell eltolni)

Feladat (f0221) Vizsgáld meg a tombbejaras.c programot. Mi történik, ha a három konstans (N, M és K) értékét megváltoztatod? Vedd N értékét valamivel nagyobbra. Vedd M értékét valamivel nagyobbra. Vedd K értékét valamivel nagyobbra. Vedd K értékét valamivel kisebbre. Mely esetekben hogyan viselkedik a program a futás során? Mi az oka a tapasztalt viselkedésnek?

Több dimenziós tömbök Többdimenziós tömbök esetén az elemek sorfolytonosan vannak a memóriában eltárolva, tehát nem valódi 2D Pl. egy 2x2 -es tömb az négy egymás utáni helyen van Egy 2D tömböt be tudunk járni pointer segítsével úgy, hogy elindulunk a [0][0] helyről (memóriacím kezdete), majd léptetjük egyesével a mutatót

2D tömbök dinamikusan C-ben 2D tömböt dinamikusan két módon hozhatunk létre Sorfolytonosan (ahogy az előbb láttuk) Tömbök tömbjeként

2D tömb sorfolytonosan Ha egy N soros, M oszlopos tömböt szeretnénk létrehozni, akkor foglaljunk le egy egy NxM méretű, egy dimenziós tömböt Ekkor a sorok és oszlopok indexelését nekünk kell kiszámolni Cserébe könnyebb a létrehozás, felszabadítás

2D tömbök dinamikusan Ha 2D tömböt dinamikusan, valódi 2D tömbként szeretnénk kezelni, akkor azt tömbök tömbjeként tehetjük meg, azaz létrehozunk minden sornak egy tömböt Majd egy újabb tömböt, melynek minden eleme egy-egy sorra mutat Felszabadításkor előbb felszabadítjuk a sorokat, majd végül a sorokat tároló fő tömböt

Két hét múlva Egy hét múlva konzultációs óra Nem kötelező bejönni, de nagyon ajánlott Gyakorló feladatok, kérdezési lehetőség Két hét múlva mini ZH a múlt heti anyagból Tömbökkel és sorozatokkal kapcsolatos algoritmikus feladatok Három hét múlva Szemantikai hibajavító feladatok és tömbös algoritmikus feladatok