Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Transmiterea argumentelor efective la apelul unei functii se face <strong>în</strong> C prin copierea<br />
valorilor argumentelor efective <strong>în</strong> argumentele formale (care sunt variabile locale ale<br />
functiei). In acest fel functia apelatã lucreazã cu duplicate ale variabilelor argumente<br />
efective si nu poate modifica accidental variabile din functia apelantã.<br />
Compilatorul C genereazã o secventã de atribuiri la argumentele formale <strong>în</strong>ainte de<br />
efectuarea saltului la prima instructiune din functia apelatã. Din acest motiv toate<br />
conversiile de tip efectuate automat la atribuire se aplicã si la transmiterea<br />
argumentelor.<br />
In functia urmãtoare se modificã aparent valoarea lui k dar de fapt se modificã o<br />
variabilã localã, fãrã sã fie afectatã variabila ce contine pe k <strong>în</strong> "main":<br />
long fact (int k) { // calcul factorial<br />
long kf=1L;<br />
while (k > 0 )<br />
kf = kf * k--; // k=k-1 dupa inmultire<br />
return kf; // rezultat functie<br />
}<br />
Un alt exemplu clasic este o functie care <strong>în</strong>cearcã sã schimbe <strong>în</strong>tre ele valorile a<br />
douã variabile, primite ca argumente:<br />
void swap (int a, int b) { // nu este corect !!!<br />
int aux;<br />
aux=a; a=b; b=aux;<br />
}<br />
void main () {<br />
int x=3, y=7;<br />
swap(x,y);<br />
printf ("%d,%d \n",x,y); // scrie 3,7 !<br />
}<br />
In general o functie C nu poate transmite rezultate si nu poate modifica argumente<br />
de un tip numeric. In C pentru transmiterea de rezultate prin argumente de cãtre o<br />
functie trebuie sã folosim argumente formale de tip pointer (adrese de memorie).<br />
Versiunea corectã pentru functia “swap” este urmãtoarea:<br />
void swap (int * pa, int * pb) { // pointeri la intregi<br />
int aux;<br />
aux=*pa; *pa=*pb; *pb=aux;<br />
}<br />
Apelul acestei functii foloseste argumente efective pointeri:<br />
int x, y ; . . .<br />
swap (&x, &y) ; // schimba valorile x si y intre ele