Pointeri
     Memoria interna pate fi privita ca o succesiune de octeti, fiecare avand un numar de ordine numit adresa. Fiecare variabila ocupa un numar de octeti determinat de tipul sau. Adresa primului octet al variabilei se numeste adresa variabilei.

    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.

Exemple si exercitii