Sunteți pe pagina 1din 3

POINTERI

Pana acum, variabilele au fost utilizate doar prin identificatori, programul neavand nevoie
de adresa in care era memorata variabila.
Pentru un program C++, memoria unui calculator e asemanatoare unei succesiuni PRECISE
de celule, fiecare celula aflandu-se la o anumita adresa, UNICA (scrisa in baza 16).
Atunci cand declaram o variabila se aloca AUTOMAT si zona de memorie. Este important sa
cunoastem ADRESA zonei de memorie in care se va pastra VALOAREA variabilei.
Definitie: Variabila ce memoreaza adesa altei variabile se numeste pointer.
DECLARAREA UNUI POINTER DE DATE
tip * variabila_pointer ;
Unde tip reprezinta tipul de baza al pointerului, care indica tipul datelor memorate la adresa
continuta in variabila_pointer.
Exemple
1a)int *p1;
//p1 este un pointer cu tipul de baza int, deci va contine adresa unei zone de memorie la
care este memorat un numar intreg
b) char *s;
//s este un pointer cu tipul de baza char, deci va contine adresa unei zone de memorie la
care este memorat un caracter

OPERATORII DE REFERENȚIERE (ADESĂ) SI DEREFERENȚIERE


Operatorul unar ADRESĂ (&)

Adresa zonei de memorie in care e pastrata VALOAREA variabilei poate fi obtinuta cu


ajutorul operatorului &, cunoscut sub denumirea de operator adresa. Acest operator va
precede numele variabilei, astfel:

&variabila

Exemplu:

P1 = &a;
//adresa variabilei a se asociaza variabilei p1

Presupunem ca variabila a este plasata la adresa 1776 si consideram urmatoarea secventa


de cod:
int a,b *p1;
a=25;
p1=&a;
b=a;
Dupa executia secventei, variabilele vor avea urmatoarele valori:
a=25, p1=1776, b=25

Concluzie: p1 memoreaza adresa variabilei a, in timp ce b va memora valoarea variabilei a.

OPERATORUL DE DEREFENTIERE (*)

O proprietate importanta a pointerilor este aceea ca pot fi utilizati pentru a accesa direct
valoarea variabilei catre care ei fac referinta. Acest lucru se poate realiza prin scrierea in
fata numelui pointerului a operatorului de derefențiere (*).

*variabila_pointer
Exemplu:

Presupunem ca variabila a este plasata la adresa 1776 si consideram urmatoarea secventa


de cod:

int a,b,c *p1;


a=25;
p1=&a;
b=a;
c=*p1; //variabilei c i se atribuie valoarea referita de p1

Observatie:
 Simbolul * folosit la declararea pointerilor, nu trebuie confundat cu operatorul de
derefentiere. Putem spune ca sunt doua lucruri diferite, reprezentate de acelasi
simbol.
2)
#include <iostream>
Using namespace std;

int main ()
{
Int a = 5, b = 15;
int * p1, * p2;
p1 = &a; // p1=adresa pt a
p2 = &b; // p2 =adresa pt b
*p1 = 10; // valoarea adresata de p1 = 10 a este 10
*p2 = *p1; // valoarea adresata de p2 = 15 b este 20
p1 = p2; // se copiaza in p1 adresa din p2
*p1 = 20; // se modifica valoarea retinuta in p1
cout<< "firstvalue is " <<firstvalue<< endl;
cout<< "secondvalue is " <<secondvalue<< endl;
return 0;
}

Observatii:
 Declararea int * p1,*p2; este diferita de declararea int *p1, p2;
 Indicarea tipului de baza e esentiala. Adresa unei zone de memorie este
de fapt adresa primului octet din zona respective. Dimensiunea zonei de
memorie a carei adresa este memorata in pointer difera de la un tip la
altul: un octet pentru char *, 2 octeti pentru int, 4 octeti pt long, etc.
 Exista o constanta pointer speciala numita “NULL”. Semnificatia acesteia
este “pointerul nu contine adresa niciunei zone de memorie”. Valoarea
acestei constante este 0.
int *r = NULL;

OPERATII CU POINTERI
INCREMENTARE/DECREMENTARE
Asupra unui pointer se pot aplica operatorul ++ si operatorul de decrementare - -.
Ca efect, se mareste/micsoreaza adresa memorata in pointer cu numarul de octeti necesari
pentru a memora o data de tipul de baza al pointerului.
Exemplu

char *p1, c;
int *p2, n;
cin>>n>>c;
p1=&c; p2=&n;
cout<<p1<<” ”<<p2;
p1++;p2++;
cout<<p1<<” ”<<p2;

ADUNAREA/SCADEREA DINTRE UN POINTER (p) SI UN INTREG(n)

p+n sau p-n

adresa memorata in pointer se mareste sau se micsoreaza cu n*sizeof(tip))


SCADEREA DINTRE DOI POINTERIse poate realiza numai daca au acelasi tip de baza.
Rezultatul este o valoare intreaga care reprezinta diferenta dintre adrese, raportata la
sizeof(tip)

COMPARATII se pot realiza numai daca au acelasi tip de baza cu ajutorul operatorilor
relationali
Exemplu: if (p!=NULL)….

S-ar putea să vă placă și