OPERATORII & si *
Inainte de toate, pointerul este o variabila, ca orice variabila, el trebuie initializat. O valoare valida pentru un pointer este fie o adresa, fie constanta 0 ( zero ) definita in fisierul an 747h71h tet "stdio-h" prin NULL, si de aici urmeaza ca un pointer este initializat prin atribuirea unei adrese ( un alt pointer ) sau a constantei simbolice NULL. Initializarea se poate
face la declararea pointerului sau in decursul programului. Exista totusi cateva restrictii , astfel daca ptr.1 si ptr.2 sunt pointeri de tip 1 respectiv de tip 2, atunci o atribuire:
ptr 1 = ptr 2 ;
este permisa numai daca:
- tip 1 si tip 2 reprezinta acelasi tip, sau
- tip 1 este void , sau
- se face o conversie explicita ( cast ) a lui tip 2 catre tip 1.
Pentru a atribui unui pointer o adresa exista operatorul & , numit si "de adresa" , care aplicat unei variabile , unui element al unui masiv sau unei structuri furnizeaza adresa zonei de memorie unde este memorat respectivul obiect . Operatorul & este unar , are aceeasi prioritate cu a altor operatori unari ++, -- , ! , - (dupa paranteze) si se asociaza de la dreapta la stanga. Nu se aplica expresiilor intre paranteze , constantelor sau variabilelor de tip register si de aceea utilizarile :
& (a + 2 * b ) sau & 13 sunt eronate.
Totusi , la lucru cu pointeri, cel mai mult intereseaza aflarea valorii din zona de memorie care are ca adresa pointerul, deci actiunea complementara celei de aflare a adresei . Operatorul care realizeaza acest lucru este operatorul unar *, numit si "de deferentiere" , sau "de indirectare", care aplicat unui pointer ne furnizeaza valoarea datei memorata la adresa pointerului.
Exemplu 5. 3. 1.
. . . .
int x, y, *px ; / * x, y - intregi ; px - pointer la int */
px = &x ; /* px este initializat cu adresa lui x */
y = * px ; /* valoarea aflata la adresa px */
/* se atribuie lui y */
Se observa ca secventa de mai sus este echivalenta cu atribuirea : y = x ;
Este permisa si notiunea de "pointer la pointer".Astfel prin : int * * ppi ;
se declara "ppi" ca fiind un pointer la un pointer de tip int. altfel spus ppi contine adresa unei zone de memorie ce contine un numar de tip int. In acest sens urmariti exemplul urmator :
Exemplu 5.3.2.
# include " studio.h"
main ( )
La executia programului pe ecranul calculatorului se va afisa :
pi = FFDE ppi = FFEO
i = 7
i = 4
i = 8
In programul precedent se observa ca operatorul * aplicat unui pointer poate sa apara in partea stanga a unei atribuiri.
Deci constructia " * pointer " este o valoare- stanga.
Exemplu 5.3.3.
In acest exemplu se va utiliza pointer de tip " void ", pointer care nu se poate dereferentia.
Urmariti situatiile cand un pointer " void " se poate utiliza ca atare si cand este obligatorie o conversie explicita ( cast ) , spre exemplu ( int * ).
# include " stdio.h"
main ( )
|