CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
Pointeri si argumente de functii
Datorita faptului ca in C este posibila transmiterea de argumente
unei functii prin 'apel prin valoare' nu exista modalitate directa
pentru functia apelata de a altera o variabila in functia apelan-
ta. Ce este de facut atunci cind de fapt, se intentioneaza schim-
barea unui argument obisnuit ? De exemplu, o rutina de sortare
trebuie sa inverseze doua elemente neordonate cu o functie swap.
Nu este suficient sa se scrie
swap(a, b);
unde functia swap este definita ca
swap(x, y) /* GRESIT */
int x, y;
Din cauza apelului prin valoare, swap nu poate afecta argumen-
tele a si b in rutina care o apeleaza.
Din fericire, exista o modalitate de a obtine efectul dorit.
Programul apelant trasmite pointeri pe valorile care trebuie
schimbate.
swap(&a, &b);
Din moment ce operatorul & da adresa unei variabile, &a este un
pointer pe a. In swap insasi, argumentele sint declarate ca fiind
pointeri iar adevaratii operanzi sint accesati prin ei ( prin
pointeri).
swap(px, py) /* interscimba *px si *py */
int *px, *py;
O utilizare comuna a argumentelor de tip poiter se intilneste in
cadrul functiilor care trebuie sa returneze mai mult decit o
singura valoare. (Veti putea obiecta ca swap returneaza doua
valori, noile valori ale argumentelor sale.) Ca un exemplu sa
luam o functie getint care realizeaza inversia la intrare prin
transsformarea unui sir de caractere in valori intregi, un intreg
la fiecare apel, getint trebuie sa returneze valoarea gasita
sau semnul de sfirsit de fisier atunci cind s-a terminat sirul de
caractere de la intrare. Aceste valori trebuie sa fie returnate ca
obiecte separate, pentru indiferent ce valoare este utilizata
pentru EOF aceasta putind fi deasemenea valoarea unui intreg-input
O solutie, care este bazata pe functia input scanf, functie
care o vom descrie in cap7, este de a folosi getint care sa
returneze ca valoare o functie EOF, atunci cind se intilneste
sfirsitul de fisier; orice alta valoare returnata inseamna ca a
fost prelucrat un intreg obisnuit Valoarea numerica a intregului
gasit este returnata printr-un argument care trebuie sa fie
pointer pe un intreg. Aceasta organizare separa starea de
sfirsit de fisier de valorile numerice.
Urmatoarea bucla completeaza un tablou cu intergi prin ape-
luri la get int.
int n, v, array[SIZE]
for (n = 0; n < SIZE && getint(&v) != EOF; n++)
array[n] = v;
Fiecare apel pune pe y pe urmatorul intreg gasit la intrare. De
notat faptul ca este esential a scrie &y in loc de y, ca arg al
lui getint. A scrie doar y constituie eroare de adresare, getint
sustinind ca are de a face cu un pointer propriu zis.
Insasi getint este o modificare evidenta a lui atoi tratata
mai inainte.
getint(pn) /* ia numarul interg -input */
int *pn;
for (*pn = 0; c >= '0' && c <= '9'; c = getch())
*pn = 10 * *pn + c - '0';
*pn *= sign;
if (c != EOF)
ungetch(c);
return(c);
}
Peste tot in getint, *pn este utilizat ca o variabila int ordina-
ra. Deasemenea, am utilizat getch si ungetch ( descrise in cap
4) in asa fel incit caracterul special ( semnalul EOF) care tre-
buie citit sa poata fi restocata la intrare.
Exercitiul 5.1 Scrieti getfloat pentru virgula floatnta analoa-
ga lui getint. Ce tip de valoare returneaza functia getfloat.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1138
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved