Capitolul 5.1. Pointeri si adrese
:: Programare :: C & C++ :: Capitolul 5
Pagina 1 din 1
Capitolul 5.1. Pointeri si adrese
Din moment ce un pointer sustine adresa unui obiect, este posibila adresarea acelui obiect "indirect" prin intermediul pointerului.
Sa presupunem ca x este o variabila, sa spunem int si ca px este un pointer creat intr-un mod neprecizat. Operatorul & da adresa unui obiect, astfel incit instructiunea
px=&x
asigneaza variabilei px adresa lui x acum, px inseamna "pointeaza pe x". Operatorul & poate fi aplicat numai variabilelor si elementelor unui tablou, constructii ca &(x+1) si &3 sint interzise. Este deasemenea interzisa pastrarea adresei unei variabile registru.
Operatorul unar * testeaza operandul sau ca adresa ultimului semnal si acceseaza aceasta adresa pentru a aduce continutul locatiei de la adresa respectiva. Astfel, daca y este tot un int
y = *px
asigneaza lui y, ori de cite ori este cazul continutul locatiei unde pointeaza px. Astfel secventa
px = &x;
y = *px;
asigneaza lui y aceasi valoare ca si
y = x
Totodata este necesara declararea variabilelor care apar in secventa:
int x, y;
int *px;
Declararea lui x si y este deja cunoscuta. Noua este declararea pointerului px
int *px
este interpretata ca o mnemonica; aceasta inseamna ca *px este un int, adica in momentul in care px apare in context sub forma *px, este echivalenta cu a intilni o variabila de tip int. De fapt, sintaxa declararii unei varaibile imita sintaxa expresiilor in care ar putea sa apara respectiva variabila. Acest rationament este util in toate cazurile care implica declaratii complicate. De exemplu:
double atof(), *dp;
spune ca intr-o expresie atof() si *dp au valoare de tip double.
De notat declaratia implicita, ceea ce vrea sa insemne ca un pointer este constrins sa pointeze o anumita categorie de obiecte. (Functie de tipul obiectului pointat).
Pointerii pot aparea in expresii. De exemplu, daca px pointeaza pe intregul x atunci *px poate aprarea in orice context in care ar putea apare x.
y = *px + 1
da lui y o valoare egala cu x plus 1.
printf("%d\n", *px)
imprima o valoare curenta a lui x si
d = sqrt((double) *px)
face ca d = radical din x, care este fortat de tipul double
inainte de a fi transmis lui sqrt (vezi capitolul 2).
In expresii ca
y = *px + 1
operatorii unari * si & au prioritate mai mare decit cei aritmetici, astfel aceasta expresie ori de cite ori pointerul px avanseaza, aduna 1 si asigneaza valoarea lui y. Vom reveni pe seama asupra a ceea ce inseamna
y = *(px + 1)
Referiri prin pointer pot apare si in partea stinga a asignarilor.
Daca px pointeaza pe x atunci
*px = 0
il pune pe x pe zero si
*px += 1
il incrementeaza pe x, ca si
(*px)++
In acest ultim exemplu parantezele sint necesare; fara ele, expresia va incrementa pe px in loc sa incrementeze ceea ce pointeaza px deoarece operatorii unari * si + sint evaluati de la dreapta la stinga.
In sfirsit, daca pointerii sint variabile, ei pot fi manipulati ca orice alta variabila. Daca py este un alt pointer pe int, atunci
py = px
copiaza continutul lui px in py facind astfel ca py sa varieze odata cu px.
Sa presupunem ca x este o variabila, sa spunem int si ca px este un pointer creat intr-un mod neprecizat. Operatorul & da adresa unui obiect, astfel incit instructiunea
px=&x
asigneaza variabilei px adresa lui x acum, px inseamna "pointeaza pe x". Operatorul & poate fi aplicat numai variabilelor si elementelor unui tablou, constructii ca &(x+1) si &3 sint interzise. Este deasemenea interzisa pastrarea adresei unei variabile registru.
Operatorul unar * testeaza operandul sau ca adresa ultimului semnal si acceseaza aceasta adresa pentru a aduce continutul locatiei de la adresa respectiva. Astfel, daca y este tot un int
y = *px
asigneaza lui y, ori de cite ori este cazul continutul locatiei unde pointeaza px. Astfel secventa
px = &x;
y = *px;
asigneaza lui y aceasi valoare ca si
y = x
Totodata este necesara declararea variabilelor care apar in secventa:
int x, y;
int *px;
Declararea lui x si y este deja cunoscuta. Noua este declararea pointerului px
int *px
este interpretata ca o mnemonica; aceasta inseamna ca *px este un int, adica in momentul in care px apare in context sub forma *px, este echivalenta cu a intilni o variabila de tip int. De fapt, sintaxa declararii unei varaibile imita sintaxa expresiilor in care ar putea sa apara respectiva variabila. Acest rationament este util in toate cazurile care implica declaratii complicate. De exemplu:
double atof(), *dp;
spune ca intr-o expresie atof() si *dp au valoare de tip double.
De notat declaratia implicita, ceea ce vrea sa insemne ca un pointer este constrins sa pointeze o anumita categorie de obiecte. (Functie de tipul obiectului pointat).
Pointerii pot aparea in expresii. De exemplu, daca px pointeaza pe intregul x atunci *px poate aprarea in orice context in care ar putea apare x.
y = *px + 1
da lui y o valoare egala cu x plus 1.
printf("%d\n", *px)
imprima o valoare curenta a lui x si
d = sqrt((double) *px)
face ca d = radical din x, care este fortat de tipul double
inainte de a fi transmis lui sqrt (vezi capitolul 2).
In expresii ca
y = *px + 1
operatorii unari * si & au prioritate mai mare decit cei aritmetici, astfel aceasta expresie ori de cite ori pointerul px avanseaza, aduna 1 si asigneaza valoarea lui y. Vom reveni pe seama asupra a ceea ce inseamna
y = *(px + 1)
Referiri prin pointer pot apare si in partea stinga a asignarilor.
Daca px pointeaza pe x atunci
*px = 0
il pune pe x pe zero si
*px += 1
il incrementeaza pe x, ca si
(*px)++
In acest ultim exemplu parantezele sint necesare; fara ele, expresia va incrementa pe px in loc sa incrementeze ceea ce pointeaza px deoarece operatorii unari * si + sint evaluati de la dreapta la stinga.
In sfirsit, daca pointerii sint variabile, ei pot fi manipulati ca orice alta variabila. Daca py este un alt pointer pe int, atunci
py = px
copiaza continutul lui px in py facind astfel ca py sa varieze odata cu px.
Subiecte similare
» Capitolul 5.8. Tablouri de pointeri, pointeri pe pointeri
» Capitolul 5.12. Pointeri pe functii
» Capitolul 5. POINTERI SI TABLOURI
» Capitolul 5.10. Comparatie pointeri. Tablouri multi-dimensionale
» Capitolul 5.3. Pointeri si tablouri
» Capitolul 5.12. Pointeri pe functii
» Capitolul 5. POINTERI SI TABLOURI
» Capitolul 5.10. Comparatie pointeri. Tablouri multi-dimensionale
» Capitolul 5.3. Pointeri si tablouri
:: Programare :: C & C++ :: Capitolul 5
Pagina 1 din 1
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum
|
|