Variabilele de tip pointer se caracterizeaza prin faptul ca valorile pe care le pot memora sunt adresa altor variabile.
O variabila de tip poiner se declara astfel:
tip *nume_pointer;
Exemplu:
int *p1, *p2; reprezinta doi pointeri
catre tipul int
float *adr1, *adr2;
poineri catre tipul float
In limbajul C++ declaratia
double a, b, *p1, *p2;
are semnificatia ca a si b sunt variabile de tip double, în timp ce p1 si p2 sunt pointeri la variabile de tip double. Aceasta înseamna ca în zonele de memorie care apar variabilelor a si b se gasesc chiar valorile acestor variabile (sub forma de date de tip double, pe câte 8 octeti), în timp ce în zonele de memorie alocate pentru variabilele p1 si p2 se gasesc adresele la care sunt situate în memorie niste date de tip double (adresele fiind numere întregi, fara semn, pe doi octeti fiecare).
Expresia p1=&a are semnificatia ca se atribuie ca valoare variabilei
p1 adresa la care se gaseste în memorie valoarea variabilei a.
Obs. Se face distinctie intre natura adreselor care pot fi memorate
Exemplu de pointer catre tipul struct:
struct elev
{ char nume[20];
float media;
};
elev *p; reprezinta un pointer catre o variabila de tip elev.
Adresa unei variabile se obtine cu operatorul de referentiere
& care trebuie sa preceada numele variabilei:
& nume_variabila;
Se poate atribui unei variabile de tip pointer adresa
altei variabile.
Exemplu:
int a=3;
int *p;
p=&a;
Variabila p de tip pointer va retine adresa variabilei a;
Pentru a avea acces la continutul variabilei a carei adresa o retine
se foloseste operatorul de deferentiere: *.
cout<<*p; //
va afisa continutul de la adresa retinuta de p deci valoarea lui a, erespectiv
7
double *p1,*p2;
Totodata, în expresii se pot folosi si valorile indicate de pointeri. Astfel, continuand exemplul de mai sus, expresia *p1/*p2 are semnificatia ca se imparte valoarea de tip double situata in memorie la adresa p1 la valoarea de tip double de la adresa p2, obtinându-se ca rezultat o valoare numerica de tip double.
Pentru a avea acces la campurile unui camp al unei structuri se pot
folosi operatorii: * ( ) si . dar si operatorul -> numit
operator de selectie indirecta.
Exemplu:
struct elev
{ char nume[20];
float media;
};
elev *p, ev ;
p=& ev;
cin>>ev.nume;
cin>>ev.media;
cout<<(*p).nume;
cout<<(*p).media; // vor afisa datele citite
Acelasi lucru se poate realiza cu operatorul ->
cout<<p->nume;
cout<<p->media;
Intre variabile de tip pointer se pot face atribuiri daca au acelasi tip sau se realizeaza conversii:
int *p1,*p2;
float *p3;
Sunt permise atribuirile:
p1=p2;
sau
p2=p1;
sau
p3=(float) p1; // conversie de tip
Operatii cu variabile de
tip pointer
Daca a este o variabila de tip ponter catre tipil x si
n un numar natural atunci:
a+n
va reprezenta o adresa care se obtine dintre adresa retinuta
de a si n * sizeof(x)
Referinte
Amintim:
Variabila – este numele dat in program unei zone de memorie
in care se gaseste o valoare.
Pointerul – este o variabila a carei valoare este o adresa.
Referinta – este o indicatie privind locul unde se gaseste o
data sau o structura de date. Este o abstractizare a conceptului de adresa.
Variabila referinta – este o variabila a carei valoare este
o referinta. Este de fapt un sinonim, un alt nume dat unei variabile obisnuite.
Observatie: Referinta nu este un numar, ca adresa, deci asupra ei nu se pot face operatii aritmetice.
Declaratia unei astfel de variabile se face astfel:
tip & nume_var=valoare_de_initializare;
Exemplu:
double a=17.38,b=0.0537,*pa=&a,&ra=a;
unde: a – variabila de tip double
pa – variabila pointer (se aloca spatiu in memorie pentru pa)
ra – variabila referinta (nu se aloca spatiu in memorie, ra fiind
un alt nume dat variabilei a)
La executarea acestei instructiuni se aloca în memorie spatii pentru valorile variabilelor a si b, introducându-se în zonele corespunzatoare valorile 17.38 si respectiv 0.0537. Se aloca, de asemenea, spatiu pentru pointerul pa, introducându-se ca valoare initiala adresa zonei de memorie alocata valorii variabilei a (notata în C si C++ prin &a). În schimb, pentru variabila ra nu se aloca spatiu în memorie, ci se considera ca ra este un alt nume dat variabilei a. În consecinta, valoarea lui ra este situata la aceeasi adresa de memorie ca valoarea variabilei a, astfel ca orice expresie în care apare ra are acelasi efect cu cea în care apare a. In instructiunile urmatoare din program poate sa fie modificata valoarea pointerului pa, astfel încât acesta sa contina adresa altei variabile (de exemplu prin expresia pa=&b se da pointerului pa ca valoare adresa variabilei b). În schimb referinta ra nu mai poate fi modificata în timpul executarii programului, ea ramânând permanent asociata variabilei a.
Daca rulati secventa:
int *p,a=3,b=9;
p=&a;
cout<<p<<endl;//afiseaza adresa lui a
int &ra=a;
cout<<"ra="<<ra;//afiseaza 3
ra++;//are ca efect si incrementarea lui a
cout<<endl<<a; //afiseaza 4
ra=b; // atentie! va avea ca rezultat modificarea valorii lui
a si nu a referintei care ramane in continuare la a
cout<<endl<<ra<<" "<<a; //afiseaza 9
9
p=&b;//valoarea pointerului se modifica, afiseaza adresa lui b
Rolul acestor variabile este urias in transmiterea parametrilor in subprograme.