FizWeb

Porkoláb Zoltán - C programozás 2017.11.13. előadás jegyzet

7. előadás: Deklarációk, definíciók, tömbök, pointerek, pointer-aritmetika, tömbök és pointerek kapcsolata, függvények, paraméterátadás.

// S (state) T (int) D  t[10] *ptr f()

nincs többdim tömb: tt[10][20]
int **pptr;
int *t[10];  // ez egy pointereket tartalmazó tömb
int (*t)[10]; // ez egy tömbre mutat
__________________________________________________
Függvények deklarálása, definiálása

double dpow(double x, double y)
{
...
}

int ipow(int a, int b)   //C-ben nem lehet ugyanolyan néven (C++-ban igen, ha mások a paraméterek)
{
int ret=0;
for(int i; i fv-re mutató pointerrel

double (*func)(double);  //ezzel deklaráltam a pointerem, ez double paraméterű és double visszatérítési értékű függvényekre tud mutatni

double (*ft[4])(double);  // itt ft egy 4 elemű tömb ([]  erősebb)
// ha deklaráltam a függvényemet, akkor a nevük alapján már hivatkozhatok rájuk (nem kell az &: &a stb.)
double (*ft[4])(double) = {sin, cos, tg, ctg};
int i;
scanf("%d", &i);
double z=(*ft[i])(.5);   //ezelőtt illik ellenőrizni h i<4

//erre való:
#include    //fejlesztés közben hasznos
...

double (*ft[4])(double) = {sin, cos, tg, ctg};
int i;
scanf("%d", &i);
assert(0<=i && i<4);
double z=(*ft[i])(.5);   //ezelőtt illik ellenőrizni h i<4

//elszáll a program, csak értelmes hibaüzenetet ír ki --> a programozónaknak hasznos, h
//a tudja értelmezni; felhasználót rákényszerítem a megf értékadásra


double exec(double par, double (*f)(double)){
return (*f)(par);
}

_____________________________________
Nagy tömb: nem illik érték szerint berakni a stackbe

char t[100000];  //  sizeof(t) --> 1000000
f(i);

  void f(char *tp);  // a fv paramétere a tömb első elemére mutató pointer

  DE:  ha máshogy írom, akkor is így csinálja
  void f(char t[100000])

  tp[i] <=> *(tp+i)         //sizeof(tp)  --> 4

  tp+i az i-edik elemre mutató pointer

többdim:
  int[10][20][30];

  BAJ: f2(int *tt)  --> ROSSZ! (warning)

  biztonságos:
  f2(int tt[10][20][30])    --> itt az első elem a t[0] tömb!!!

  ezt jelenti?
  f2(int (*p)[20][30])
  f2(int tt[][20][30])

  tt[i][j][k]  --  *(((tt+i)+j)+k)

_______________________________________
malloc:

BAJ: a következő fv nem szabadítja fel a tárterületet:   //memory leak

char *answer(char *q){   //question
printf("%s", q);
char *buffer = (char *)malloc(80);
fgets(buffer, 80, stdin);
return buffer;
}

char *p= answer("How are you?");
printf("%s", p);
free(p);


legjobb így lenne: //a külvilág foglal területet (vagyis a main fv, ami használja)

char answer(char *q,char *buffer, int)


int main(){
char buffer[80], buffer[20];
printf("%s ", answer("Hogy vagy?", buffer, 80))
}