Aritmetica pointerilor

Aritmetica acestui tip de date este puțin diferită de aritmetica întregilor, de pildă. În primul rând, pentru că sunt permise doar două operații: adunarea și scăderea. Dar, și așa, semnificațiile sunt diferite de cele menționate anterior, permițând obținerea unor rezultate diferite, în funcție de dimensiunea tipurilor referite. După cum știm, tipurile tipurile de date fundamentale din C++ au dimensiuni diferite. Astfel, de obicei, char este reprezentat pe 1 octet, int pe 2 sau 4 etc. Putem, pentru a construi un exemplu, presupune că char are un octet, int 2, iar long 4 octeți. În aceste condiții, presupunem că am avea declarările: char *pc; int *pi; long *pl; și că, variabilele pointer declarate indică spre locațiile 1000, 2000, 3000.

Cum spuneam, operațiile pc++; pi++; pl++; sunt permise. Numai că, efectul obținut nu este același în fiecare caz. În primul caz, varibila pc va conține valoarea 1. Variabilele pi, respectiv pl vom conține, în mod curios, valorile 2002, respectiv 3004. Explicația este că, în cazul pointerilor, incrementarea se face cu numărul de octeți pe care este reprezentat tipul de bază, pentru ca, în urma acestei operații, ei să indice către elementul următor de același tip.

Un plus de atenție este necesar când folosim pointeri și diferite tipuri de operatori pentru construirea unor expresii. Astfel, în expresia *p++; nu vom obține acces la valoarea aflată la adresa consecutivă adresei indicate de p, pentru că operatorul ++, deși are prioritatea mai mare decât cel de dereferențiere, fiind postfixat, își face efectul după evaluarea expresiei.

Există patru posibile combinații între operatorul de dereferențiere și operatorii ++, respectiv -- și anume:

*p++  // incrementează pointerul, dar dereferențiază adresa neincrementată

(*p)++ //face dereferențierea și apoi incrementează pointerul

*++p //incrementează pointerul și, apoi, face dereferențierea

++*p //face dereferențierea și apoi incrementează pointerul