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



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

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

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

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

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:

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.

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

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

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

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)

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

Programozas 1. Strukturak, mutatok

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

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

5. gyakorlat. Konstansok Tömbök Stringek

Programozás I gyakorlat

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

Bevezetés a C++ programozási nyelvbe

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

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

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

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

Programozás II. 4. 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

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

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

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

C++ programozási nyelv Konstruktorok-destruktorok

5. Gyakorlat. struct diak {

Programozási Nyelvek: C++

Pénzügyi algoritmusok

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

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

OOP #14 (referencia-elv)

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

3. Osztályok II. Programozás II

Struktúra nélküli adatszerkezetek

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.

C programozási nyelv

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.

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 C++ -ban

Programozás I gyakorlat

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

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

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

Adatszerkezetek Tömb, sor, verem. 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

C++ programozási nyelv

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

Óbudai Egyetem. C programozási nyelv

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

Informatika terméktervezőknek

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

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

Osztályok. 4. gyakorlat

Programozás C és C++ -ban

Információs Technológia

Készítette: Nagy Tibor István

Bevezetés a programozásba I.

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

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

Programozás I gyakorlat

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Programozás I. 5. Előadás: Függvények

Java II. I A Java programozási nyelv alapelemei

Pénzügyi algoritmusok

Programozás I gyakorlat

Programozás II gyakorlat. 6. Polimorfizmus

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

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

Programozási nyelvek Java

Programozás C és C++ -ban

Programozás C++ -ban 2007/1

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Vezérlési szerkezetek

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

C programozási nyelv

Programozás C++ -ban

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?

Java és web programozás

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

Felvételi tematika INFORMATIKA

Java II. I A Java programozási nyelv alapelemei

1. Alapok. Programozás II

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Programozás I. gyakorlat

Bevezetés a C++ programozási nyelvbe

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

Információs Technológia

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

Programozás II. Fájlkezelés

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

C++ programozási nyelv

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

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

Átírás:

C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15

Pointerek (mutatók) Pointerek (mutatók) A pointerek olyan speciális adattípusok, amelyek nem értéket tárolnak, hanem valamilyen objektumnak (változónak, függvénynek) a címét tartalmazza. Egy egész típusú változóra mutató pointer deklarációja: int *ip; Itt a * karakter jelzi, hogy pointerről van szó. FIGYELEM!!! a mutatókat használatuk előtt inicializálni kell!!! Hogyan kap értéket a pointer? int *ip; int i;. ip=&i; Itt a & operátor az úgynevezett címképző operátor. Ez unáris, ne tévesszük össze a bitenkénti és-sel. Mostmár azip az i címét tartalmazza. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 2 / 15

Indirekció Pointerek (mutatók) Az indirekt értékadás azt jelenti, hogy egy változónak mutatón keresztül adunk értéket. Például: Szó szerint!! int *ip; j változó értéke legyen int i=5,j; egyenlő az ip által címzett. változó értékével. ip=&i; Mondom SZÓ SZERINT!!!. Ezt nevezzük indirekt j=*ip; értékadásnak. Ha elfelejtjük ip inicializálni, a program rendszertől függő hibákat generál. Kultúráltabb rendszereknél futás közben hibaüzenetet kapunk. Sokkal veszélyesebb, ha nem kapunk visszajelzést. Még visszatérünk a mutatókhoz. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 3 / 15

Tömbök Tömbök A tömbök a legegyszerűbb összetett adatszerkezetek. Jellemzőik: szigorúan azonos típusú adatokat tartalmaznak, az adatok egymás után helyezkednek el a tárban. 0 1 2 n-1 A memória eleje A memória vége C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 4 / 15

Tömbök Deklaráció és hozzáférés Egydimenziós tömb deklarációja, példa: int t[10]; Egy tíz elemű egészeket tartalmazó tömb deklaráziója. A kérdéses tömb elemeinek indexei 0, 1,..., 9 tartományban vannak. A tömb egy elemének az elérése, példa: t[5]=23; Tehát az elemet indexeléssel érhetjük el. Az index csak pozitív egész szám lehet. Tehát konstans szám, vagy egész jellegű változó. t[i]=23; ahol i egy pl. int. A tömb kérédéses elemét úgy használhatjuk, mint egy azonos típusú közönséges változót. Probléma a túlindexelés. Változóval történő indexelés esetén futásközben az index kívül van az idexelési tartományon. Pl. i értéke 11. A program rendszertől függő hibákat generál. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 5 / 15

Tömbök Többdimenziós tömbök Kétdimenziós egész tömb deklarálása, pl.: int t[3][2]; A leghátsó index változik a leggyorsabban. Vagyis. 00 01 10 11 20 21 A memória eleje A memória vége Tetszőleges számú dimenzió lehetséges. De a dimenziók számának növekedésével exponenciálisan növekszik a memória foglalás. Az elem elérése itt is indexeléssel történik. Tehát: Az indexekre azonos szabályok t[1][1]=5; vonatkoznak, mint egydimenziós esetben. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 6 / 15

Tömbök Tömbök inicializálása deklarációnál Megadhatunk kezdőértéket a tömbnek deklarációnál. int t[10]={6,8,-2,6,123,-8,3,4,2,1}; Ezt szépen sorban berakja a tömb elemeibe, de csak deklarációnál! Ha inicializálunk, nem kell megadni a tömb méretét. int t[]={6,8,-2,6,123,-8,3,4,2,1}; A fordító kitalálja mekkora legyen a tömb. Ha kevesebb elemet adunk meg, mint amekkora a méret a fennmaradó helyeket 0-val tölti ki. Többdimenziós esetben. Szépen: int t[3][2]={ {1,2}, {3,4}, {5,6}}; Csúnyán: int t[3][2]={ 1,2,3,4,5,6}; Sokkal nagyobb figyelmet kíván, mint a baloldali. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 7 / 15

Tömb pointer Tömbök Töltsük be a tömb kezdőcímét egy mutatóba! int t[10]; int *p; Tehát a tömb kezdőcíme a tömb neve. Vagyis:. p=t; azonos p=&t[0]; p=t; Ha tehát ez igaz, akkor a kezdőcím átadása után, használhatjuk a pointert, mint tömböt, pl.: p[5]=13; Ha nem a tömb kezdőcímét akarjuk megadni, akkor csak a címképző operátorral dolgozhatunk. p=&t[5]; Akkor most vissza a pointerekhez! C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 8 / 15

Pointer aritmetika Tömbök Deklaráljunk egy int pointert és egy 10 elemű int tömböt. int *p; int t[10];. p=t; Ezt eddig már láttuk. p++; Kérdés hová mutat a p ezután. A következő bájtra, vagy t[1] -re? A válasz: t[1] -re. Tehát egy adott pointer inkrementálása annyival (bájttal) növeli az általa tartalmazott címet, amekkora a mérete annak a típusnak, amelyre mutat. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 9 / 15

Pointer aritmetika Tömbök További műveletek: dekrementálás fordítottja az inkrementálásnak, egész hozzáadása pointerhez int *p,*q; p=q+5; egész kivonása pointerből int *p,*q; p=q-5; p pointer értéke q+5*sizeof(int). p pointer értéke q-5*sizeof(int). két pointer kivonása megadja a két pointer által mutatott cím távolságát az adott típusban. Szóval akkor: t[5]=13; ugyanaz, mint *(t+5)=13; C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 10 / 15

Tömbök Példa a pointer használatára Írjunk egy olyan függvényt, amely két int tipusú változót összead és egyben ki is von egymásból. Egy függvény egyetlen paramétert adhat vissza a return használatával. Az ötlet az, hogy azoknak a változóknak, amelyekben majd az eredményt kapjuk, a címét adjuk át a függvénynek. Hogyanis: 1 void muv(int a,int b,int *r1,int *r2) 2 { 3 *p1=a+b; 4 *p2=a-b; 5 } Vagyis a 3. sorban p1 által címzett változóba kerüljön a, b összege. Vagyis a 4. sorban p2 által címzett változóba kerüljön a, b különbsége. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 11 / 15

Tömbök Példa a pointer használatára A teljes program: void muv(int,int,int *,int *); int main(void) { int x,y,i,j; x=6,y=7; muv(x,y,&i,&j); printf("%i %i",i,j); return 0; } void muv(int a,int b,int *r1,int *r2) { *p1=a+b; *p2=a-b; } C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 12 / 15

void pointer Tömbök A void pointer egy típus nélküli pointer. Akkor szoktuk használni, ha egy memória címre van szükségünk, de nem ismerjük azt a konkrét típust, amelynek a példányára mutat. A legnevezetesebb void pointer a NULL pointer, amelyenk a definíciója az stdio.h header fájlban taláható meg. #define NULL (void *)0 Ez konkrétan a nullás memória címre mutat, amely a programozható eszközök nagy többségében nem használható változó tárolására. A NULL pointer hibajelzésre, szükségtelen paraméterek jelzésére használjuk. Fájl és dinamikus memória kezelésnél fogjuk látni. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 13 / 15

Sztringek Tömbök A sztring egy speciális karakter típusú tömb, amelyet egy 0 értékű karakter zár le. Teljesen mindegy, hogy mekkora a tömb a sztringet a 0 zárja le. Azért ne legyen hosszabb, mint a tömb! A sztring inicializálása speciális módon történhet deklarációnál és csakis deklarációnál: char nev[]="schuster"; Ez hozzáfüzi a lezáró 0-t is. Tehát a nev tömb 9 elemű. Ez sokkal egyszerűbb, mintha a hagyományos inicializálást csinálnánk: char nev[]={ S, c, h, u, s, t, e, r,0}; A lezáró elem 0 és nem 0!! C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 14 / 15

Függvény pointerek Tömbök Van egy függvényünk, a deklarációja: int fgv(int); Deklaráljunk egy függvény pointert! int (*fgvp)(int); Adjunk neki értéket! fgvp=fgv; Hívjuk a függvényt a pointeren keresztül! r=fgvp(5); C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 15 / 15