Implementarea aritmeticii de pointeri in C++

1 comment - This post in english

In limbajul de programare C++, zonele de memorie pot fi accesate indirect prin variabile de tip pointer [...]. De asemenea, avand la dispozitie o adresa de memorie, se asigura deplasarea pe zona de memorie pornind de la adresa stocata in variabila pointer. Acest lucru se asigura prin operatori aritmetici si poarta denumirea de aritmetica de pointeri.


In functie de natura operatorului aritmetic, sunt permise urmatoarele deplasari pe zona de memorie:

  • deplasarea inainte: asigurata de operatorii ++ si +; operatorul ++ determina modificarea valorii adresei de memorie pentru variabila la care se aplica prin cresterea cu valoarea sizeof(TipDataPointer) a adresei stocate; noua adresa puncteaza catre o zona de memorie cu sizeof(TipDataPointer) octeti mai mare decat adresa anterioara; operatorul + nu determina modificarea adresei de memorie pentru variabila pointer operand si intra in componenta unei expresii care contine cel mult un operand de tip variabila pointer; cel putin un operand (exceptand variabila pointer) indica numarul de elemente cu care se creste adresa de memorie stocata in variabila pointer; produsul dintre aceasta valoare si sizeof(TipDataPointer) reprezinta numarul de bytes cu care creste zona de memorie referita prin noua adresa.

Exemple:

int *pi;
pi=new int;
*pi=2;//initializarea continutului referit prin pointerul pi
pi++;//se incrementeaza cu valoarea 4 adresa de memorie din pi, \
aferenta cresterii adresei din pi cu 1 element de tipul int; \
noua adresa este suprascrisa in variabila pi si refera o zona de memorie \
heap cu sizeof(int) bytes mai mare decat adresa \
anterioara; noua valoare int referita prin pointerul pi \
este una reziduala
int *pj;
pj=pi+1;//valoarea adresei de memorie din pi nu se modifica; adresa \
de memorie stocata de pj este adresa din pi la care \
se aduna valoarea 4 aferenta cresterii adresei cu 1 element \
de tipul int; dupa atribuire, pj refera o zona \
de memorie cu sizeof(int) bytes peste zona referita \
de pi si un continut cu valoare reziduala
  • deplasarea inapoi: asigurata de operatorii – - si -; operatorul - - determina modificarea valorii adresei de memorie pentru variabila la care se aplica prin scaderea cu valoarea sizeof(TipDataPointer) a adresei stocate; noua adresa puncteaza catre o zona de memorie cu sizeof(TipDataPointer) octeti mai mica decat adresa anterioara; operatorul - nu determina modificarea adresei de memorie pentru variabila pointer operand si intra in componenta unei expresii; daca cel putin un operand nu este variabila pointer atunci acesta indica valoarea cu care se scade adresa de memorie stocata in variabila pointer; produsul dintre aceasta valoare si sizeof (TipDataPointer) reprezinta numarul de bytes cu care scade zona de memorie referita prin noua adresa.

Exemple:

int *pi;
pi=new int;
*pi=2;//initializarea continutului referit prin pointerul pi
pi--;//se decrementeaza cu valoarea 4 adresa de memorie \
din pi aferenta scaderii adresei cu 1 element \
de tipul int; noua adresa este suprascrisa in variabila \
pi si refera o zona de memorie heap cu sizeof(int) \
bytes mai mica decat adresa anterioara; noua valoare int \
referita prin pointerul pi este una reziduala
int *pj;
pj=pi-1;//valoarea adresei de memorie din pi nu se modifica; \
adresa de memorie stocata de pj este adresa din pi \
din care se scade valoarea 4 aferenta scaderii adresei cu \
1 element de tipul int; dupa atribuire, \
pj refera o zona de memorie cu sizeof(int) bytes \
sub zona referita de pi si un continut cu valoare reziduala
pj=pi+1;//valoarea adresei de memorie din pi nu se modifica; \
zadresa de memorie stocata de pj are valoarea initiala a adresei \
din pi la momentul alocarii memoriei heap; variabila \
pointer pj refera zona de memorie heap de tip int \
cu continutul de valoare 2

Alte operatii aritmetice permise pe zone de memorie in limbajul de programare C++:

  • diferenta dintre doua variabile pointer din interiorul aceluiasi sir de valori: precizeaza numarul de elemente de tipul TipDataPointer cuprins intre operanzii expresiei de diferenta;

Exemplu:

int *pi,*pj;
pi=new int [10];//se aloca in memorie heap spatiu pentru \
memorarea a 10 valori de tip int
pj=pi+6;//pj contine adresa elementului cu deplasament \
6 (pozitia 7 in sirul de valori)
int n=pj-pi;//n contine numarul de elemente \
de tipul int cuprins intre pi si pj, \
respectiv valoarea 6 in modul; semnul valorii intregi indica pozitiv \
pentru pj>pi si negativ pentru pj<pi
  • adunarea a doua variabile pointer nu este permisa, fiind generata eroare de compilare.

, , , , , , , , ,