Sunteți pe pagina 1din 4

OPERAŢII CU POINTERI

Asupra pointerilor se pot face diferite operaţii. Deoarece ei conţin adrese atunci operaţiile
se realizează cu adrese.

Incrementare şi decrementare
Operatorii de incrementare şi decrementare se pot aplica variabilelor de tip pointer.

Efectul:

operatorul de incrementare aplicat asupra unui operand de tip pointer spre tipul tip măreşte
adresa conţinută de operand cu numărul de octeţi necesari pentru a păstra o dată de tipul tip.

operatorul de decrementare se execută în mod analog, cu singura diferenţă că în loc să se


mărească adresa, ea se micşorează cu numărul corespunzător de octeţi.

De obicei decrementările şi incrementările adreselor sunt mai rapide ca execuţie când se au în


vedere prelucrări de tablouri.

Exemplu:

int tab[10];

int *p;

int i=0;

p=&tab[i];

p++; // p contine adresa lui tab[1]

// cu p se pot face referiri la orice element de tablou

Adunarea şi scăderea unui întreg dintr-un pointer


Dacă p este un pointer, sunt corecte expresiile de forma:

p+n şi p-n

unde n este de tip întreg.


Efectul:

expresia p+n măreşte valoarea lui p cu n*nr_tip, unde nr_tip este numărul de octeţi necesari
pentru a memora o dată de tipul tip spre care pointează p;

analog expresia p-n micşorează valoarea lui p cu n*nr_tip.

Dacă x este un tablou de tipul tip, atunci x este pointer, deci o expresie de forma:

x+n;

este corectă şi deoarece x este un pointer spre primul său element x[0], x+n va fi un pointer
spre elementul x[n]. Rezultă că valoarea elementului x[n] se poate reprezenta prin expresia:

*(x+n);

Astfel variabilele cu indici se pot înlocui prin expresii cu pointeri. Aceasta permite ca la
tratarea tablourilor să se folosească expresii cu pointeri în locul variabilelor cu indici.
Versiunile cu pointeri sunt de obicei optime în raport cu cele realizate prin intermediul
indicilor.

Compararea a doi pointeri


Doi pointeri care pointează spre elementele aceluiaşi tablou pot fi comparaţi folosind
operatorii de relaţie şi de egalitate. Astfel, dacă p şi q sunt doi pointeri care pointează spre
elementele tab[i], respectiv tab[j] ale tabloului tab, expresiile următoare au sens:

p<q p!=j p= =q.

Observaţii:

1o. Pointerii nu pot fi comparaţi decât în condiţiile amintite mai sus (deci dacă sunt pointeri
spre elementele aceluiaşi tablou).

2o. Operatorii = = şi != permit compararea unui pointer şi cu o constantă simbolică specială


având numele NULL. Aceste comparaţii permit să stabilim dacă un pointer conţine o adresă
sau nu. Astfel, dacă expresia:

p= = NULL

este adevărată, p nu conţine o adresă. Dacă expresia respectivă are valoarea fals atunci p
conţine o adresă. Constanta simbolică NULL este definită în fişierul stdio.h
Diferenţa a doi pointeri
Doi pointeri care pointează spre elementele aceluiaşi tablou pot fi scăzuţi. Rezultatul
diferenţei a doi pointeri este definit astfel: fie t un tablou de un tip oarecare şi p şi q doi
pointeri, p conţine adresa elementului t[i] iar q conţine adresa elementului t[i+n]. Atunci
diferenţa q-p are valoarea n.

Exemple

Vom da câteva funcţii asupra şirurilor de caractere:

funcţia lungime

unsigned lungime (char*x)

{ int i;

for (i=0; *x != ‘\0’; i++) x++; // sau for (i=0; *x++; i++);

return i;

funcţia copiază

void copiaza(char *x, char *y) // copiaza din zona de adresa y

// in zona de adresa x

{ while(*x++ = = *y++); }

funcţia concateneaza

void concateneaza (char *x, char *y)

// concateneaza sirul de adresa y la sfarsitul sirului

// de adresa x

{ while (*x) x++; // avans de adresa pana la sfarsitul sirului x

while (*x++= *y++);

funcţia compara

int compara (char *x, char *y)


{ while (*x= = *y)

{ if (*x= = ‘\0’) return 0;

x++;

y++;

return *x - *y; // daca diferenta caracterelor este

// negativa atunci x<y altfel x>y

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