Informatika2-2013/Gyakorlat05

A MathWikiből
A lap korábbi változatát látod, amilyen Kkovacs (vitalap | szerkesztései) 2013. március 12., 02:16-kor történt szerkesztése után volt.

Ismétlés

  • Függvények, pl:
double atlag(double a, int b){
    double x;
    x = (a + b) / 2;
    return x;
  • Írtunk hatványozó függvényt, és egy olyan függvényt ami tömböt kapott bemenetként, így lehet tömböt átadni függvénynek (vagy pointerrel):
void fv(int t[], int v){...}
  • Pointerek:
  • Megtanultunk pointereket használni, melyekkel közvetlenül a memóriát kezelhetjük, így változók értékét már függvényekkel is tudjuk módosítani.
int *p;      // Létrehozunk egy int pointert p névvel
int a = 5;
 
p = &a;      // Az a változó pointerét eltároljuk p-ben
scanf("%d", p);   // Így például az a változóba olvasnánk be
 
printf("%d", *p); // Ezzel pedig az a értékét írnánk ki
 
*p = 15;     // Pointeren keresztül értéket is átírhatunk
printf("%d", a);  // Így ez mostmár 15-öt adna ki
  • Azt is megtudtuk, hogy a tömbök pointerek, és nem tudjuk lekérni a méretüket, mert maga a program sem tárolja a méretüket, errõl nekünk kell gondoskodnunk.
  • Átírtuk a hatványozó függvényünket, hogy pointereken keresztül kapja az értékeket, majd mégjobban átírtuk hogy egy pointer segítségével az eredményt egy változóba másolja.


Dinamikus memória foglalás

  • Függvények:
    • malloc megadott byte-ot foglal le a memóriában,
    • realloc a már lefoglalt memória-tömb méretét változtatja meg,
    • calloc memóriafoglalás és a lefoglalt memória byte-jainek 0-ra állítása egyben,
    • free üríti a megadott memória-részt.
  • Példa malloc és free-re:
...
int i;          // ciklusváltozónak
int m;          // ebbe olvassuk be a tömb méretét
scanf("%d",&m);  
int *vec = (int *)malloc(m * sizeof(int)); // itt foglaljuk le a memóriát a tömbnek
...
for(i=0; i<M; i++){
  vec[i]=i*i;      // majd feltöltjük a tömböt az indexek négyzetével
}
...
  • A memóriafoglalás rész kifejtve:
    • int *vec -el létrehozunk egy int pointert
    • le szeretnénk foglalni m darab int-nyi helyet
    • a sizeof(int) visszaadja az int méretét byte-okban
    • m * sizeof(int) megadja mennyi byte kell a tömbhöz
    • malloc(m * sizeof(int)) lefoglal ekkora részt a memóriában és visszaadja az erre a területre mutató pointert
    • de amit visszaad az egy void pointer! (hogy más típusú tömböknél is lehessen használni)
    • ezért az (int *)-al ezt a void * -ot átkonvertáljuk int * típusúvá
  • Itt megjelent egy új dolog a típuskonverzió, másnével castolás, pl:
...
int a = 2;
int b = 4;
double c = a / (double)b;
...
  • Ez jól fog értéket adni c-nek, 0.5-öt, annak ellenére hogy a és b is int-ek.
  • A b-t double-é castoljuk (ez még az osztás elõtt megtörténik), így egy egész lesz osztva egy double-el aminek már double az értéke.
Személyes eszközök