Capitolul 5.1. Pointeri si adrese

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 5.1. Pointeri si adrese

Mesaj  zooky la data de Mier Mar 18, 2009 1:45 pm

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.
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum