Extras din laborator
1.1. Declararea unui pointer la functii
Pointerii folositi pâna acum au fost pointeri la diferite tipuri de date, dar este
posibil sa avem si pointeri la functii. Pointerii la functii sunt folositi din aceleasi motive
ca si pointerii la date: atunci când se doreste un alt nivel de indirectare, când dorim
ca aceeasi secventa de cod sa apeleze functii diferite depinzând de conditiile concrete
ale programului.
Ca si în cazul pointerilor la date, pentru utilizarea pointerilor la functii trebuie sa
declaram o variabila care sa contina un pointer la functie. Un pointer la o functie se
declara astfel:
tip (*pf)(tip1 p1, tip2 p2, ..., tipn pn);
unde
tip este tipul functiei (tipul valorii returnate de functie)
tip1 p1, tip2 p2, ..., tipn pn este lista parametrilor functiei care va fi
accesata prin intermediul pointerului. Numele parametrilor, adica p1, p2, ..., pn
pot lipsi.
Exemplu, daca scriem
int (*pfi)(float a, int b);
se declara pfi ca fiind un pointer la o functie care va returna un întreg. Ca si în alte
declaratii * indica faptul ca avem un pointer, iar ( ) arata ca avem de a face cu o
functie. Parantezele din (*pfi) sunt necesare deoarece si în declaratii exista o
anumita precedenta a operatorilor (o anumita ordine de evaluare interpretare) ca si
în expresii si când ordinea implicita nu este cea dorita, trebuie sa o schimbam folosind
parantezele de explicitare. În declaratii, ( ) - operatori de functie si [ ] - operatorii
de indexare sunt mai prioritari decât * indicând pointerii. Fara parantezele
mentionate, declaratia de mai sus arata astfel:
int *pfi(float a, int b);
si declara o functie pfi care va returna un pointer la întreg. Cu parantezele explicite,
int (*pfi)() ne spune ca pfi este mai întâi un pointer, ca acest pointer indica o
functie si mai apoi ca functia respectiva returneaza un întreg.
Pointerii la functii se pot defini si ca noi tipuri de date prin utilizarea declaratiei
de tip typedef. De exemplu, putem scrie
typedef int (*FPTR)(float a, int b);
si identificatorul FPTR este un sinonim pentru tipul de data pointer la o functie care
returneaza un întreg, astfel încât declaratia
FPTR pfi;
este echivalenta cu
int (*pfi)(float a, int b);
O data declarat, unui pointer la functie i se poate atribui valoarea adresei de
început a functiei dorite. Daca avem prototipurile urmatoarelor functii
int f1(float a, int b);
int f2(float a, int b);
int f3(float a, int b);
atunci putem scrie:
pfi = &f1;
sau
if (conditie)
pfi = &f2;
else
pfi = &f3;
Bineînteles, nu vom fi restrânsi la aceste doua forme, putem asigna pointeri la
functii în orice conditii dorim. Al doilea exemplu poate fi scris mai compact:
pfi = conditie ? &f2 : &f3;
În aceste exemple am folosit operatorul &, asa cum am facut pâna acum pentru
a genera un pointer. Totusi când generam pointeri la functii, operatorul & este
optional, deoarece atunci când mentionam numele unei functii fara sa o apelam
mentionam de fapt adresa functiei respective, numele unei functii fiind de fapt un
pointer la functia data. Astfel se poate scrie:
pfi = f1;
Preview document
Conținut arhivă zip
- Pointeri la Functii.pdf