´ nyelv C programozasi ¨ ok, ¨ pointer aritmetika Pointerek, tomb ¨ Dr. Schuster Gyorgy
2011. junius ´ 16.
¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
1 / 15
´ Pointerek (mutatok)
´ Pointerek (mutatok) ´ adatt´ıpusok, amelyek nem ert ´ eket ´ ´ A pointerek olyan specialis tarolnak, ´ ´ ´ ´ hanem valamilyen objektumnak (valtoz onak, fuggv ¨ enynek) a c´ımet tartalmazza. ´ t´ıpusu´ valtoz ´ ´ mutato´ pointer deklaraci ´ oja: ´ Egy egesz ora int *ip; ˝ van szo. ´ Itt a * karakter jelzi, hogy pointerrol
´ ´ ˝ inicializalni ´ FIGYELEM!!! a mutatokat hasznalatuk elott kell!!! ´ eket ´ Hogyan kap ert a pointer? int *ip; int i; . . . ip=&i;
¨ Dr. Schuster Gyorgy ()
´ ´ o˝ Itt a & operator az ugynevezett ´ c´ımkepz ´ ´ ´ ¨ operator. Ez unaris, ne tevessz uk ¨ ossze a ´ es-sel. ´ bitenkenti ´ azip az i c´ımet ´ tartalmazza. Mostmar
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
2 / 15
´ Pointerek (mutatok)
Indirekcio´ ´ ekad ´ ´ azt jelenti, hogy egy valtoz ´ ´ ´ Az indirekt ert as onak mutaton ´ ´ ´ ´ keresztul ¨ adunk erteket. Peldaul: Szo´ szerint!! int *ip; ´ ´ eke ´ legyen j valtoz o´ ert int i=5,j; ´ egyenlo˝ az ip altal c´ımzett . . ´ ´ ´ ´ ´ v altoz o ert ek evel. . Mondom ip=&i; ´ SZERINT!!! . SZO . . Ezt nevezzuk ¨ indirekt j=*ip; ´ ekad ´ ´ ert asnak. ´ ˝ fugg ´ Ha elfelejtjuk ¨ ip inicializalni, a program rendszertol ¨ o˝ hibakat ´ Kultur ´ ´ futas ´ kozben ¨ general. ´ altabb rendszereknel hibauzenetet ¨ ´ ´ kapunk. Sokkal veszelyesebb, ha nem kapunk visszajelzest. ´ visszater ´ unk ´ Meg ¨ a mutatokhoz.
¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
3 / 15
¨ ¨ Tomb ok
¨ ok ¨ Tomb
0 1 2 n-1
¨ Dr. Schuster Gyorgy ()
A memória vége
szigoruan ´ azonos t´ıpusu´ adatokat tartalmaznak, ´ utan ´ az adatok egymas ´ helyezkednek el a tarban.
A memória eleje
¨ ¨ a legegyszerubb ¨ ˝ A tomb ok ˝ osszetett adatszerkezetek. Jellemzoik:
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
4 / 15
¨ ¨ Tomb ok
´ o´ es ´ hozzaf ´ er ´ es ´ Deklaraci ´ tomb ¨ ´ oja, ´ pelda: ´ Egydimenzios deklaraci int t[10]; ´ ¨ Egy t´ız elemu˝ egeszeket tartalmazo´ tomb ´ oja. ´ deklarazi ´ eses ´ ¨ ´ A kerd tomb elemeinek indexei 0, 1, . . . , 9 tartomanyban vannak. ¨ ´ ´ ese, ´ ´ A tomb egy elemenek az eler pelda: t[5]=23; ´ az elemet indexelessel ´ ´ ´ Tehat erhetj uk ¨ el. Az index csak pozit´ıv egesz ´ lehet. Tehat ´ konstans szam, ´ ´ jellegu˝ valtoz ´ ´ szam vagy egesz o. t[i]=23; ahol i egy pl. int. ¨ ´ ed ´ eses ´ ´ ugy ´ A tomb ker elemet ´ hasznalhatjuk, mint egy azonos t´ıpusu´ ¨ ons ¨ eges ´ ´ ´ koz valtoz ot. ´ ´ ¨ en ´ o˝ indexeles ´ eseten ´ ´ ´ Valtoz Problema a tulindexel ´ es. oval tort ´ ozben ¨ ´ tartomanyon. ´ futask az index k´ıvul ¨ van az idexelesi ´ eke ´ 11. Pl. i ert ˝ fugg ´ ´ A program rendszertol ¨ o˝ hibakat general. ¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
5 / 15
¨ ¨ Tomb ok
int t[3][2]; ´ o´ index valtozik ´ A leghats a leggyorsabban. Vagyis.
00 01 10 11 20 21
A memória vége
´ ´ egesz ´ tomb ¨ Ketdimenzi os ´ asa, ´ deklaral pl.:
A memória eleje
¨ ´ tomb ¨ ok ¨ Tobbdimenzi os
˝ ´ u´ dimenzio´ lehetseges. ´ ´ szam ´ anak ´ Tetszoleges szam De a dimenziok ¨ ´ evel ´ ´ ¨ ´ ´ noveked es exponencialisan novekszik a memoria foglalas. ´ ese ´ itt is indexelessel ´ ¨ enik. ´ ´ Az elem eler tort Tehat: ´ Az indexekre azonos szabalyok t[1][1]=5; ´ esetben. vonatkoznak, mint egydimenzios ¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
6 / 15
¨ ¨ Tomb ok
¨ ok ¨ inicializal ´ asa ´ deklaraci ´ on ´ al ´ Tomb
´ eket ´ ¨ ´ on ´ al. ´ Megadhatunk kezdo˝ ert a tombnek deklaraci int t[10]={6,8,-2,6,123,-8,3,4,2,1}; ´ ¨ ´ on ´ al! ´ Ezt szepen sorban berakja a tomb elemeibe, de csak deklaraci ´ ¨ ´ et. ´ Ha inicializalunk, nem kell megadni a tomb meret int t[]={6,8,-2,6,123,-8,3,4,2,1}; ´ mekkora legyen a tomb. ¨ A ford´ıto´ kitalalja ´ Ha kevesebb elemet adunk meg, mint amekkora a meret a fennmarado´ helyeket 0-val ¨ ki. tolti ¨ ´ esetben. Tobbdimenzi os ´ Szepen: ´ Csuny ´ an: int t[3][2]={ {1,2}, int t[3][2]={ 1,2,3,4,5,6}; {3,4}, ´ mint a Sokkal nagyobb figyelmet k´ıvan, {5,6}}; baloldali.
¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
7 / 15
¨ ¨ Tomb ok
¨ Tomb ↔ pointer ¨ uk ¨ ˝ ımet ´ egy mutatoba! ´ Tolts ¨ be a tomb kezdoc´ int t[10]; int *p; . . .
´ a tomb ¨ ˝ ıme a tomb ¨ Tehat kezdoc´ neve. Vagyis:
p=t; azonos p=&t[0]; p=t; ´ ez igaz, akkor a kezdoc´ ˝ ım atad ´ ´ utan, ´ hasznalhatjuk ´ Ha tehat asa a ¨ ¨ pl.: pointert, mint tomb ot, p[5]=13; ¨ ˝ ımet ´ akarjuk megadni, akkor csak a c´ımkepz ´ o˝ Ha nem a tomb kezdoc´ ´ operatorral dolgozhatunk. p=&t[5]; Akkor most vissza a pointerekhez!
¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
8 / 15
¨ ¨ Tomb ok
Pointer aritmetika ´ ´ egy 10 elemu˝ int tomb ¨ ¨ Deklaraljunk egy int pointert es ot. int *p; int t[10]; . . . p=t;
´ lattuk. ´ Ezt eddig mar
p++;
´ es ´ hova´ mutat a p ezutan. ´ Kerd
¨ ´ A kovetkez o˝ bajtra, vagy t[1] -re? ´ t[1] -re. A valasz: ´ egy adott pointer inkremental ´ asa ´ annyival (bajttal) ´ ¨ Tehat noveli az ´ ´ altala tartalmazott c´ımet, amekkora a merete annak a t´ıpusnak, amelyre mutat. ¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
9 / 15
¨ ¨ Tomb ok
Pointer aritmetika ´ Tovabbi muveletek: ˝ ´ as ´ ford´ıtottja az inkremental ´ asnak, ´ dekremental ´ hozzaad ´ asa ´ pointerhez egesz ´ eke ´ int *p,*q; p pointer ert p=q+5; q+5*sizeof(int). ´ kivonasa ´ pointerbol ˝ egesz int *p,*q; ´ eke ´ p pointer ert p=q-5; q-5*sizeof(int). ´ pointer kivonasa ´ megadja a ket ´ pointer altal ´ ket mutatott c´ım ´ ´ at ´ az adott t´ıpusban. tavols ag ´ Szoval akkor: t[5]=13;
¨ Dr. Schuster Gyorgy ()
ugyanaz, mint
*(t+5)=13;
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
10 / 15
¨ ¨ Tomb ok
´ ´ ara ´ Pelda a pointer hasznalat ´Irjunk egy olyan fuggv ´ ´ int tipusu´ valtoz ´ ´ osszead ¨ ´ ¨ enyt, amely ket ot es ´ ol. ´ egyben ki is von egymasb ´ egyetlen parametert ´ Egy fuggv ¨ eny adhat vissza a return ´ aval. ´ hasznalat ¨ ´ ´ Az otlet az, hogy azoknak a valtoz oknak, amelyekben majd az ´ ´ adjuk at ´ a fuggv ´ eredmenyt kapjuk, a c´ımet ¨ enynek. Hogyanis: 1 void muv(int a,int b,int *r1,int *r2) 2 { 3 *p1=a+b; 4 *p2=a-b; 5 } ´ ´ ´ ¨ a, b osszege. ¨ Vagyis a 3. sorban p1 altal c´ımzett valtoz oba kerulj ¨ on ´ ´ ´ ¨ a, b Vagyis a 4. sorban p2 altal c´ımzett valtoz oba kerulj ¨ on ¨ ´ kul ¨ onbs ege. ¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
11 / 15
¨ ¨ Tomb ok
´ ´ ara ´ Pelda a pointer hasznalat 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; } ¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
12 / 15
¨ ¨ Tomb ok
void pointer ´ uli A void pointer egy t´ıpus nelk ¨ pointer. ´ ´ ´ unk, Akkor szoktuk hasznalni, ha egy memoria c´ımre van szuks ¨ eg ¨ de ´ t´ıpust, amelynek a peld ´ any ´ ara ´ mutat. nem ismerjuk ¨ azt a konkret A legnevezetesebb void pointer a NULL pointer, amelyenk a ´ az stdio.h header fajlban ´ ´ defin´ıcioja talahat o´ meg. #define NULL (void *)0 ´ ´ memoria ´ Ez konkretan a nullas c´ımre mutat, amely a programozhato´ ¨ ¨ ¨ ´ ´ ´ ´ ´ as ´ ara. ´ eszkozok nagy tobbsegeben nem hasznalhat o´ valtoz o´ tarol ´ ´ ´ ´ ere ´ A NULL pointer hibajelzesre, szuks ¨ egtelen parameterek jelzes ´ hasznaljuk. ´ es ´ dinamikus memoria ´ ´ el ´ fogjuk latni. ´ Fajl kezelesn
¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
13 / 15
¨ ¨ Tomb ok
Sztringek ´ karakter t´ıpusu´ tomb, ¨ ´ ek ´ u˝ A sztring egy specialis amelyet egy 0 ert ´ le. karakter zar ¨ ´ Teljesen mindegy, hogy mekkora a tomb a sztringet a 0 zarja le. ´ ne legyen hosszabb, mint a tomb! ¨ Azert ´ ´ asa ´ specialis ´ modon ´ ¨ enhet ´ ´ on ´ al ´ es A sztring inicializal tort deklaraci ´ on ´ al: ´ csakis deklaraci char nev[]="Schuster"; ´ uzi ´ o´ 0-t is. Tehat ´ a nev tomb ¨ Ez hozzaf ¨ a lezar 9 elemu. ˝ ´ ´ ast ´ Ez sokkal egyszerubb, ˝ mintha a hagyomanyos inicializal ´ ank: ´ csinaln char nev[]={’S’,’c’,’h’,’u’,’s’,’t’,’e’,’r’,0}; ´ o´ elem 0 es ´ nem ’0’!! A lezar ¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
14 / 15
¨ ¨ Tomb ok
´ pointerek Fuggv ¨ eny ´ unk, ´ oja: ´ Van egy fuggv ¨ eny ¨ a deklaraci int fgv(int); ´ ´ pointert! Deklaraljunk egy fuggv ¨ eny int (*fgvp)(int); ´ eket! ´ Adjunk neki ert fgvp=fgv; ´ H´ıvjuk a fuggv ¨ enyt a pointeren keresztul! ¨ r=fgvp(5);
¨ Dr. Schuster Gyorgy ()
´ nyelv Pointerek, tomb ¨ ¨ pointer aritmetika C programozasi ok, 2011. junius ´ 16.
15 / 15