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))
}