Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Putem declara pointeri către orice tip de date, atât către tipurile standard C, cât şi către tipurile pe care
le definim noi. În plus, limbajul C ne permite să declarăm pointeri la funcţii.
Numele unei funcţii reprezintă adresa de memorie la care începe funcţia. Numele functiei este, de fapt,
un pointer la funcţie.
Se poate stabili o corespondenţă între variabile şi funcţii prin intermediul pointerilor la funcţii. Ca şi
variabilele, aceşti pointeri:
• pot primi ca valori funcţii;
• pot fi transmişi ca parametrii altor funcţii
• pot fi intorşi ca rezultate de către funcţii
La declararea unui pointer către o funcţie trebuiesc precizate toate informaţiile despre funcţie, adică:
• tipul funcţiei
• numărul de parametri
• tipul parametrilor
care ne vor permite să apelăm indirect funcţia prin intermediul pointerului.
Declararea unui pointer la o funcţie se face prin:
tip (*pf)(listă_parametri_formali);
Dacă nu s-ar folosi paranteze, ar fi vorba de o funcţie care întoarce un pointer.
Cu pointerii la funcţii se lucrează la fel ca şi cu pointerii la orice tip de date. Se foloseşte operatorul &
pentru a obţine adresa de memorie a unei funcţii. Se foloseşte operatorul * pentru a obţine funcţia spre
care indică un pointer.
#include <stdio.h>
int main()
{
/* Definim un pointer la functii cu doi parametri de tip int
si care returneaza void. */
void (*un_pointer) (int y, int z);
un_pointer = &alta_functie;
alta_functie(33, 44);
(*un_pointer) (34, 45);
return 0;
Este posibil să definim un tablou de pointeri la funcţii; apelarea funcţiilor, în acest caz, se face prin
referirea la componentele tabloului.
#include <stdio.h>
void plus()
{
printf("+");
}
void minus()
{
printf("-");
}
void dolar()
{
printf("$");
}
int main()
{
int i;
return 0;
Am definit patru functii care au aceeaşi semnătură (acelaşi număr/tip de parametri, şi acelaşi tip de
date returnat). Pe urmă am definit un vector de patru pointeri la funcţie şi am memorat în vectorul
respectiv adresele celor patru funcţii. Pe urmă putem apela într-un mod flexibil cele patru funcţii
folosindu-ne de vectorul definit şi de cicluri for.
Numele unei funcţii fiind un pointer către funcţie, poate fi folosit ca parametru în apeluri de funcţii.
În acest mod putem transmite în lista de parametri a unei funcţii – numele altei funcţii.
De exemplu, o funcţie care calculează integrala definită:
3
b
I = ∫ f(x) dx
a
va avea prototipul:
double integrala(double, double, double(*)(double));
Exemplu:
Definiţi o funcţie pentru calculul unei integrale definite prin metoda trapezelor,cu un număr fixat n de
puncte de diviziune:
b
f(a) + f(b) n−1
b − a
∫ f(x)dx = h + ∑ f(a + ih) cu h =
a 2 i=1 n
Folosiţi apoi această funcţie pentru calculul unei integrale definite cu o precizie dată ε. Această precizie
este atinsă în momentul în care diferenţa între două integrale, calculate cu n, respectiv 2n puncte de
diviziune este inferioară lui ε
#include <math.h>
double sinxp();
double trapez(double,double,int,double(*)());
int main()
{
int n=N;
double In,I2n,vabs;
In=trapez(a,b,n,sinxp);
do { n*=2;
I2n=trapez(a,b,n,sinxp);
if((vabs=In-I2n)<0) vabs=-vabs;
In=I2n;
} while(vabs > eps);
printf(“%6.2lf\n”, I2n);
return 0;
}
for(s=0.0,i=1;i<n;i++)
s+=(*f)(a+i*h);
4
s+=((*f)(a)+(*f)(b))/2.0;
s*=h;
return s;
}
În C, transmiterea parametrilor la funcţii se face prin valoare. Când trimitem o variabilă ca parametru
unei funcţii, se trimite de fapt o copie a variabilei. Dacă în interiorul funcţiei se fac modificări asupra
parametrului, variabila originală nu este afectată. După încheierea apelului de funcţie variabila are
aceeaşi valoare ca şi înainte de apel.
Spre exemplu în următorul program avem o funcţie care modifică valoarea parametrului primit. Vom
observa că pe parcursul execuţiei funcţiei parametrul se modifica, dar imediat ce se iese din funcţie
variabila care a fost trimisă ca parametru revine la valoarea pe care o avea înainte de apel.
#include <stdio.h>
int main(void)
{
int variabila = 100;
/* Apelam functia. */
o_functie(variabila);
return 0;
5
Dacă dorim ca o variabilă să păstreze modificările făcute asupra ei într-o funcţie, trebuie să procedăm
astfel: trimitem ca parametru la funcţie un pointer care conţine adresa variabilei. În funcţie nu
modificăm pointerul primit, dar îl folosim pentru a accesa locaţia de memorie unde se afla variabila şi
a scrie noi valori la locaţia respectivă. În felul acesta modificăm de fapt valoarea variabilei. La
revenirea din funcţie vedem că modificările nu se mai pierd.
#include <stdio.h>
int main(void)
{
int variabila = 100;
return 0;
}