CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
: | |
Structuri si functii
Exista un numar de restrictii relative la structurile in C.
Regulile esentiale sint ca nu puteti face asupra unei
structuri decit operatia de obtinere a adresei cu &, si de
accesare a unuia dintre membrii structurii. Acest lucru presupune
ca structurile nu pot fi asignate sau copiate ca un tot unitar, si
ca nu pot fi nici pasate sau returnate intre functii. (Aceste
restrictii vor fi ridicate in versiunile viitoare.) Pointerii
la structuri nu se supun insa acestor restricti, si de aceea
structurile si functiile coopereaza confortabil. In fine,
structurile automate, ca si tablourile automate, nu pot
fi initializate; nu pot aceasta decit stucturile statice.
Sa vedem citeva din aceste probleme rescriind functiile de
conversie de data din capitolul precedent, folosind structuri.
Deoarece regulile interzic pasarea de structuri direct unei
functii, trebuie fie sa pasam componentele separat, fie sa pasam
un pointer catre intregul obiect. Prima alternativa se foloseste
de day_of_year asa cum am scris in capitolul 5:
d.yearday = day_of_year(d.year, d.month, d.day);
Celalalt mod este de a pasa un pointer. Daca am declarat pe
hiredate ca:
struct date hiredate;
si am rescris pe day_of_year, putem apoi spune:
hiredate.yearday = day-of-year(&hiredate);
deci pointerul lui 'hiredate' trece la 'day-of-year'. Acum
functia trebuie sa fie modificata deoarece argumentul sau
este un pointer si nu o lista de variabile.
day-of-year(pd) /* set day of year from month, day */
struct date *pd;
Declaratia 'struct date *pd;' spune ca pd este un pointer la o
structura de tip data. Notatia 'pd->year' este noua. Daca p este
pointer la o structura, atunci
p->member-of-structure
refera un membru particular. (Operatorul -> este un minus
urmat de >.) Cu ajutorul pointerului pd poate referit si un
membru al structurii, de exemplu membrul 'year':
(*pd).year
Deoarece pointerii la structuri sint des utilizati este
preferabila folosirea operatorului ->, forma mai scurta. In
constructia de mai sus parantezele sint necesare deoarece
operatorul '.' este prioritar fata de '*'. Atit '->' cit si '.' se
asociaza de la stinga la dreapta astfel:
p->q->memb
emp.birthdate.month
sint
(p->q)->memb
(emp.birthdate).month
Pentru completare dam o alta functie 'month-day' rescrisa folosind
structurile.
month-day(pd) /* set month and day from day of year */
struct date *pd;
Operatorii de structura '->' si '. ' impreuna cu '()' pentru
liste si '[]' pentru indici in ierarhia prioritatilor sint cei
mai puternici. De exemplu la declaratia:
struct *p;
atunci ++p->x incrementeaza pe x si nu p, deoarece ordinea
implicita este ++(p->x). Parantezele pot fi utilizate pentru a
modifica prioritatile: (++p)->x incrementeaza p inainte de a
accesa x, iar (p++)->x incrementeaza p dupa aceea. (Acest ultim
set de paranteze nu este necesar. De ce ?)
In acelasi sens, *p->y aduce ceea ce pointeaza y; *p->y++
incrementeaza y dupa ce se face accesul la ceea ce
pointeaza y (la fel cu *s++); (*p->y)++ incrementeaza ceea ce
pointeaza y; si *p++->y incrementeaza p dupa accesul la ceea ce
pointeaza y.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1199
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved