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++; int *pj; pj = pi + 1;
- pe linia 4 se incrementează cu valoarea 4 adresa de memorie din pi, aferenta creșterii 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
- pe linia 6 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 înapoi: asigurata de operatorii – – si –; operatorul – – determina modificarea valorii adresei de memorie pentru variabila la care se aplica prin scăderea cu valoarea sizeof(TipDataPointer)
a adresei stocate; noua adresa punctează către o zona de memorie cu sizeof(TipDataPointer)
octeti mai mica decât 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 numărul 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--; int *pj; pj=pi-1; pj=pi+1;
- pe linia 4 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
- pe linia 6 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
- pe linia 7 valoarea adresei de memorie din pi nu se modifica; adresa 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 operații 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
- adunarea a doua variabile pointer nu este permisa, fiind generata eroare de compilare.