Függvények, mutatók Csernoch Mária
Függvények függvény definíciója az értelmezési tartomány tetszőleges eleméhez hozzárendel egy értéket –függvény helyettesítési értéke –x f(x) –D f R f definíció szerint egy értéket adnak vissza C-ben –értéket nem adnak vissza –egy értéket adnak vissza –több értéket adnak vissza
Függvények a függvény definícióban szereplő tárolók –formális paraméterek –formális argumentumok –paraméterek a függvényhívás során megadott értékek –aktuális paraméter –aktuális argumentumok –argumentumok
Függvények paraméterezése és a függvényérték a paraméterek deklarációs sorrendje követi a pareméterek sorrendjét semmilyen összevonás sem lehetséges a deklarált paramétereket a függvényen belül a függvény lokális változóként használja, a függvényen kívülről nem érhetők el a visszaadott érték az utasításban szereplő kifejezés értéke –return kifejezés;
Függvények paraméterezése és a függvényérték ha a függvény definíciójában nem adjuk meg a visszatérési típust, akkor alapértelmezés szerint int típusú lesz a függvény a void típus felhasználásával olyan függvényeket készíthetünk, amelyek nem adnak vissza értéket
Függvényhívás a függvényhívás olyan kifejezés, amely átadja a vezérlést és az argumentumokat az aktualizált függvénynek a C, C++ nyelveken az argumentumok érték szerint adódnak át –az argumentumok másolatát veszi fel a megfelelő paraméter értékként –következmény a függvényen belül a paraméteren bármilyen műveletet végezhetünk, annak nincs kihatása a híváskor megadott argumentumra –átadott érték változónak a címe függvényből „kihivatkozva” megváltoztathatjuk a változó értékét
Pointerek, mutatók minden változónak van címe annak a memóriarekesznek a címe, amellyel kezdődően hely van foglalva számára a memóriában változó címe tárolható címtípusú változókban tárolhatók a címek pointerek, mutatók
Pointerek definiálása * pl. –int *p; egy int típusú változó címét tartalmazhatja –double *q; egy double típusú változó címét tartalmazhatja
Pointer operátorok & –a változó címére hivatkozunk –& * –a pointeren keresztül arra a változóra hivatkozunk, amelyre mutat (a pointer által mutatott objektum, a mutatott érték előállítása) –* pl. –int a=5, *p; p = &a; // p pointer az ‘a’ változóra mutat printf(”%d\t%d\t%d\n”,p, a,*p); printf(”%X\t%X\t%X\n”,p, a,*p);
Mit csinál? int k1=1, k2=2, k3=3, k4=4, k5=5; int *p; p=&k1; printf("%X\t%d\n",p,*p); printf("%X\t%X\t%X\t%X\t%X\n",p,p+1,p+2,p+3, p+4);
Tárolás címértéknév 22FF6C1k1 pointer p
Tárolás címértéknév 22FF6C1k1 22FF70 pointer p p+1
Tárolás címértéknév 22FF6C1k1 22FF70 22FF74 pointer p p+1 p+2
Tárolás címértéknév 22FF6C1k1 22FF70 22FF74 22FF78 pointer p p+1 p+2 p+3
Tárolás címértéknév 22FF6C1k1 22FF70 22FF74 22FF78 22FF7C pointer p p+1 p+2 p+3 p+4
Mit csinál? int i; int k[5]; int *kt; kt=k; for (i=0; i<5; i++){ k[i]=i; printf("%d\t",k[i]); printf("%d\n",kt); printf("%d\n",kt+i); }
Mit csinál? int i; int k[5]; int *kt; kt=k; for (i=0; i<5; i++){ k[i]=i; printf("%d\t",k[i]); printf("%d\t",kt); printf("%d\n",kt+i); }
Mit csinál? int i; char c, *p1=&c; float *p2=(float *)&c; printf("%X\n%X\n\n",p1,p2); for (i=0; i<20; i++){ printf("%X\t%X\n",p1+i,p2+i); }
Mit csinál? int i; char c, *p1=&c; float *p2=(float *)&c; printf("%X\n%X\n\n",p1,p2); for (i=0; i<20; i++){ printf("%X\t%X\n",p1+i,p2+i); }
Lépésköz charfloatcímnév p1p222FF2Bc p1+122FF2C p1+222FF2D p1+322FF2E p1+4p2+122FF2F p1+522FF30 p1+622FF31 p1+722FF32 p1+8p2+222FF33
Egydimenziós tömbök egydimenziós tömbök (vektorok) deklarálása típus név[méret] méret –konstans –a tömbben tárolható elemek számát definiálja példák egydimenziós tömbök deklarálására –int a[5]; –float b[20]; –tömb méretének megadása makróval: char c[N]; #define N 100; char c[N];
Tömbök a tömb elemei azonos típusúak tömb elemeinek indexelése –0-tól (méret − 1)-ig hivatkozás tömb elemre –pl.: a[0], b[5] 0a[0] 1a[1] 4a[2] 9a[3] 16a[4] int a[5]tömb dekl. atömb neve a: a[0]a[1]a[2]a[3]a[4]
Egydimenziós tömbök inicializálása int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; char szo[15] = {‘a’, ‘l’, ‘m’, ‘a’}; –tárolási osztálytól függően 0 v. határozatlan float valosak[ ] = {23.5, 49.2, 3.45}; –a tömb automatikusan 3 eleműre definiálódik int a[5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; –helytelen, túl sok a kezdőérték –C semmilyen ellenőrzést nem végez a tömb indexeire vonatkozóan –indexhatár átlépése veszélyes
Tömbök és pointerek egy tömb neve nulladik elemének címe (pointer konstans, amely a tömb 0-dik elemére mutat) int a[5]; int *p; p = &a[0]; // a mutatót a tömb első elemére irányítjuk p = a; vagy int a[5], *p = a; a: a[0]a[1]a[2]a[3]a[4] p: p+1p+2p+3p+4
Tömbök és pointerek A tömb 0-dik elemének a címe –a &a[0] A tömb i-edik elemének címe –a + i &a[ i ] –&p[ i ] –a + i –p + i Különbség ‘p’ és ‘a’ között, hogy ‘a’ konstans, ‘p’ változó –p = a; // helyes –p++; // helyes –a = p; // hibás –a++; // hibás
Tömbök és pointerek A tömb 0-dik eleme –a[0] –p[0] –*(a + 0) –*(p + 0) –*a –*p A tömb i-edik eleme –a[ i ] –p[ i ] –*(a + i) –*(p + i)
Többdimenziós tömbök Általános alak –típus név [méret1] [méret2] … [méretn]; Kétdimenziós tömbök (mátrixok) –típus név [méret1] [méret2] –méret1: tömb sorainak száma –méret2 tömb oszlopainak száma
Kétdimenziós tömbök inicializálása int matrix [3] [5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; int matrix [3] [5] = {{1, 2, 3, 4, 5} {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}};
Kétdimenziós tömbök elemeinek elérése matrix [2] [3] Sorok címe:s/o01234 matrix[0] matrix[1] matrix[2]
Tömbök átadása paraméterként #define N 10 void tombolvas(int * a, int n); main(){ int i, m=5; int aa[N]; srand(time(NULL)); tombolvas(aa,m); for(i=0; i<m; i++){ printf("%d\t",aa[i]); } } void tombolvas(int * a, int n){ int i; for(i=0; i<n; i++){ a[i]=rand()%41+10; printf("%d\t",a[i]); } printf("\n"); }
Tömbök átadása paraméterként #define N 10 void tombolvas2(int a[ ], int n); main(){ int i, m=5; int aa[N]; srand(time(NULL)); tombolvas2(aa,m); for(i=0; i<m; i++){ printf("%d\t",aa[i]); } } void tombolvas2(int a[ ], int n){ int i; for(i=0; i<n; i++){ a[i]=rand()%41+10; printf("%d\t",a[i]); } printf("\n"); }
Tömbök átadása paraméterként #define N 10 typedef int i10vek[N]; void tombolvas3(i10vek a, int n); main(){ int i, m=5; i10vek vel; srand(time(NULL)); tombolvas3(vel,m); for(i=0; i<m; i++){ printf("%d\t",vel[i]); } } void tombolvas3(i10vek a, int n){ int i; for (i=0; i<n; i++){ a[i]=rand()%41+10; printf("%d\t",a[i]); } printf("\n"); }