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

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

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

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

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

Java II. I A Java programozási nyelv alapelemei

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Java II. I A Java programozási nyelv alapelemei

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

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

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:

Programozás I gyakorlat

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

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

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

A C programozási nyelv IV. Deklaráció és definíció

Készítette: Nagy Tibor István

A C programozási nyelv II. Utasítások. A függvény.

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

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

OOP #14 (referencia-elv)

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

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

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

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

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

Bevezetés a C++ programozási nyelvbe

5. Gyakorlat. struct diak {

Kivételkezelés a C++ nyelvben Bevezetés

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 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)

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

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

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

Programozas 1. Strukturak, mutatok

Pénzügyi algoritmusok

10. gyakorlat. Pointerek Tárolási osztályok

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

Típusok és konstansok

A C# programozási nyelv alapjai

Programozási nyelvek II.: JAVA, 4. gyakorlat

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

Programozási nyelvek Java

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

Programozási nyelvek II.: JAVA, 4. gyakorlat

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

Informatika terméktervezőknek

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

Programozás 5. Dr. Iványi Péter

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

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

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

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

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozási nyelvek Java

Szövegek C++ -ban, a string osztály

Programozás C++ -ban

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

1. Alapok. Programozás II

Programozás C és C++ -ban

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

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

1. Jelölje meg az összes igaz állítást a következők közül!

Programozás. C++ típusok, operátorok. Fodor Attila

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

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.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

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

1. Egyszerű (primitív) típusok. 2. Referencia típusok

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

Pénzügyi algoritmusok

Maximum kiválasztás tömbben

Algoritmizálás és adatmodellezés tanítása 1. előadás

5. gyakorlat. Konstansok Tömbök Stringek

Kifejezések. Kozsik Tamás. December 11, 2016

Alprogramok, paraméterátadás

Programozás módszertan

Programozási Nyelvek: C++

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

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

A programozás alapjai 1 Rekurzió

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

Virtuális függvények (late binding)

Algoritmizálás + kódolás C++ nyelven és Pascalban

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Ha meg akarod tudni, hogy az egyes típusok milyen méretűek a te rendszereden, a következő program megmutatja:

Programozás I gyakorlat

3. Osztályok II. Programozás II

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.

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

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.

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

C++ programozási nyelv Konstruktorok-destruktorok

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

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

Átírás:

A C programozási nyelv III. Pointerek és tömbök. Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 1 Mutató (pointer) fogalma A mutató olyan változó, amely egy másik objektum címét tartalmazza. Mutató deklarációja: tipusnév* azonosító Egy objektum címe megkapható az & operátorral. A mutató által megcímzett objektum értékére a *pointerazonosító kifejezéssel hivatkozhatunk, amely balérték! A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 2 Formális példa int a; int b; int* pa; pa = &a; /* A "pa"-ban az "a" címe */ b = *pa; /* b=a értékadás */ *pa = 0; /* a=0 értékadás */ (*pa)++; /* a++ */ /* *pa++ nem a fenti, hanem *(pa++)! */ A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 3 CBEV/ 1

Címaritmetika 1. Mivel a mutató is változó, így értéket kaphat, mÿveletek végezhet krajta. Amÿveletek definíciója figyelembe veszi azt a tényt, hogy a mutató címet tárol Amÿveletek eredményét befolyásolja az, hogy a mutató milyen típusra mutat. A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 4 Megengedett mÿveletek: Címaritmetika 2. mutató és egész összeadása, kivonása mutató inkrementálása, dekrementálása Eredménye újabb cím, amely ugyanolyan típusú objektumra mutat. Kiszámítása: típus* p; int n; esetén a p+n értékét úgy határozzuk meg, hogy a p értékéhez az n * sizeof(típus) eltolást hozzáadjuk. A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 5 Címaritmetika 3. Megengedett mÿveletek (folytatás): két mutató kivonása Eredménye egész, a két cím között elhelyezked,adott típusú elemek száma. Csak egy tömbön belüli mutatók esetén értelmes az eredmény. mutatók összehasonlítása Eredménye egész, és csak speciális esetekben értelmezhet A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 6 CBEV/ 2

Címaritmetika 4. Megengedett mÿveletek (folytatás): mutatónak "0" érték adása mutató összehasonlítása 0-val A "0" érvénytelen cím, ezzel jelezhetjük, hogy a pointer értéke még beállítatlan mutató indexelése - lásd kés bb! mutatók közötti értékadás Nem azonos alaptípusú mutatók között általában értelmetlen. Egyéb veszélyei is vannak (példák kés bb.) A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 7 Mutatók és tömbök 1. A C- ben egy tömb azonosítóját a fordító mindig a tömb els elemét megcímz (konstans, és értékkel rendelkez ) mutatóként kezeli. Következmények: egy tömb elemei indexeléssel és mutatóaritmetikával egyaránt elérhet k a mutatók is indexelhet k tömbeseténakezd címet kapja meg a függvény Példák: A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 8 Mutatók és tömbök 2. Legyen a deklarációs részben az alábbi sor: int *pa,a[10],i; és tételezzük fel, hogy végrehajtódott az alábbi: pa = &a[0]; A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 9 CBEV/ 3

Mutatók és tömbök 3. Kifejezés Vele egyenértékÿ pa=&a[0] pa = a Jelentés A pa mutató az a tömb els elemére mutat a[i] &a[i] *(pa+i) *(a+i) pa[i] pa+i a+i Hivatkozás az a tömb i indexÿ elemére Az a tömb i indexÿ elemének címe A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 10 Karakterlánc és mutató A string-állandó karaktertömb, és megengedett egy karaktertömböt karakterlánccal inicializálni. Ugyanezen okból megengedett egy char* mutató és egy string közötti értékadás, mert ez két mutató közötti értékadást jelent. Például: char *string; string="ez egy szoveg" használható, és ez után például *(string+3) vagy string[3] egyenl 'e'-vel A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 11 Mutató tömb, mutatót címzÿ mutató Mivel a mutató is változó, így tömbökbe foglalható, címezheti mutató. Példa: 100 darab char típusú mutatót tároló tömb: char* sor[100]; A tömb azonosítója is mutató, ezért asor is az egychar* mutatót (a sor[0]-át) címez meg tehát típusa char** A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 12 CBEV/ 4

Többdimenziós tömbök Kétdimenziós tömb: egydimenziós tömb, amelynek minden eleme tömb int a[10][5] jelentése (int a[10])[5], azaz olyan 5 elemÿ tömb, amelynek minden eleme egy 10 elemÿ egész tömb a típusa int (*a)[5] (mert olyan mutató, ami 5elemÿ, egész tömböket tartalmazó tömböt címez) következmény: a C tömbök elemei sorfolytonosan tárolódnak a memóriában A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 13 Többdimenziós tömbök tárolása j i n x m "i" darab Egy tömbelem helyének kiszámításához szükséges az oszlopok száma!!! m m... m i * m + j A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 14 Többdimenziós tömb és mutatótömb 1. Kétdimenziós tömb int a[10][10] Helyfoglalás: 100 db egész Mutatótömb int *b[10] 10 darab cím Mivel b[5] int* típusú mutató, indexelhet, tehát b[5][5] írható. Jelentése: "a b[5] által megcímzett helyt l számított 5. int elem" Következmény: csak akkor értelmes, ha b[5] beállított!!! A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 15 CBEV/ 5

Többdimenziós tömb és mutatótömb 2. Példa: char s[3][10]; char *st[3]; s[0]= "Elsÿ"; s[1]= "Második"; s[2]= "Harmadik"; Az s tömb 30 byte-nyi helyet foglal le, és minden string hossza korlátozott 10- re. Az s[1][5] az i betÿt jelenti. A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 16 Többdimenziós tömb és mutatótömb 3. st[0] = "Elsÿ"; st[1] = "Második"; st[2] = "Harmadik"; Az st[3] 3 címnek szükséges helyet foglal el Ehhez még hozzáadódik a karaktersorozatok tárolására szükséges hely (de csak a feltétlenül szükséges) Tetsz leges hosszúságú stringek tárolhatók. Az st[1][5] most is az i betÿt jelenti. A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 17 Mutató, mint függvény argumentum 1. Függvény argumentuma egydimenziós tömb a tömbazonosító mutató => a függvény a tömb els elemének címét kapja meg. A deklaráció formájától függetlenül a tömbelemekre mutatókkal vagy indexeléssel is hivatkozhatunk. átadható egy tömb tetsz leges elemének címe is Példa: Formális paraméter Hivatkozás int a[] a[i] vagy *(a+i) int *a a[i] vagy *(a+i) A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 18 CBEV/ 6

Mutató, mint függvény argumentum 2. Függvény argumentuma többdimenziós tömb A tömbelemek helyének kiszámításához kellenek a függvénynek a dimenziók határai (az els kivételével) Példák: int a[10][5] int a[][5] int (*a)[5] Az algoritmus számára külön paraméterekben kell megadni a tényleges dimenzió-határokat Hibalehetÿség: ellentmondó paraméterezés!!! A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 19 Mutató, mint függvény argumentum 3. Példa: double atlag(int mat[][10], int n, int m) { double sum = 0; int i,j; for (i=0; i<n; i++) for (j=0; j<m; j++) sum += matr[i][j]; return sum - n * m; } A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 20 Mutató, mint függvény argumentum 4. Hívás: main() { int a[5][10]; int n, m, i, j; double atlagos; n = 3; m = 8; szam = 0; for (i=0; i<n; i++) for (j=0; j<m; j++) a[i][j] = szam++; atlagos = atlag(a, n, m); } A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 21 CBEV/ 7

Mutató, mint függvény argumentum 5. Hibalehetÿségek: n > 5 vagy m > 10 index túllépést okoz az aktuális paraméter tömb második dimenziójának elemszáma nem 10 hibás számítást eredményez a tömbelemek helyének kiszámításánál A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 22 Mutató, mint függvény argumentum 6. Függvény argumentuma egy változó mutatója így indirekt hivatkozással megváltoztatható a függvény argumentumának értéke. Példa: két argumentum értékének cseréje: void csere (int* x,int* y) { int temp; temp = *x; *x = *y; *y = temp; } A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 23 Mutató, mint függvény argumentum 7. A függvény hívása: main() { int a,b;.. csere (&a,&b);.. } A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 24 CBEV/ 8

Mutató, mint függvény argumentum 8. Összefoglalva: egy formális paraméter két okból lehet egyszerÿ mutató egydimenziós tömböt vesz át a függvény az aktuális paraméter egy tömb azonosítója vagy valamelyik elemének címe lehet a formális paraméter tömb elemeire indexeléssel vagy mutató aritmetikával hivatkozunk egy változó értékét akarja megváltoztatni a fgv. az aktuális paraméter egy balérték címe lehet a formális paraméter értékére indirekcióval hivatkozunk A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 25 CBEV/ 9