Alături de dereferențiere, pe care o știm deja, asupra pointerilor se pot aplica următoarele operații: incrementarea și decrementarea, adunarea cu un număr întreg, diferența a doi pointeri. Aceste operații sunt utile mai ales când pointerii memorează adrese ale unor elemente dintr-un tablou.
Fie următoarea secvență:
int v[5] = {1,2,3,4,5}, *p;
p = v;
Pointerul p memorează adresa primului element al tabloului, (p == &v[0]).
Incrementarea/decrementarea
Asupra variabilelor de tip pointer, la fel ca asupra celor de tip numeric, se pot aplica operatorul de incrementare ++ și cel de decrementare, --, care pot fi prefixați sau postfixați. Efectul acestor este mărirea, respectiv micșorarea valorii adresei memorate de pointer cu dimensiunea tipului de bază al pointerului.
p ++;
Valoarea pointerului p crește cu numărul de octeți alocați tipului int ( sizeof(int), de regulă 4). Astfel, valoarea lui p devine egală cu adresa lui v[1], adică p == &v[1], iar *p este aceeași variabilă cu v[1]:
*p = 7; cout << v[1]; // 7
Adunarea/scăderea unui pointer cu un număr întreg
Forma operației este p + n sau p - n, iar rezultatul mărirea/micșorarea adresei memorate în p cu n * sizeof(TIP), unde TIP este tipul de bază al pointerului p.
p = v; *(p + 2) = 10; cout << v[2] << endl; // 10 cout << (p + 3)[1] << endl; // 5
p + 2 este adresa lui v[2], deci prin dereferențiere obținem variabila v[2]. Aceasta devine 10.
p + 3 este un pointer; aplicându-i operația de indexare, (p + 3)[1] este un element al tabloului v aflat la distanța 3 + 1 de primul element, adică este v[4].
Scăderea a doi pointeri
Scăderea se poate face doar dacă cei doi pointeri au același tip de bază TIP. Rezultatul este diferența dintre adrese, împărțită la sizeof(TIP).
int v[10], *p, *q; p = v + 4; // *p este v[4] q = v + 7; // *q este v[7] cout << q - p << endl; // 3 cout << p - v << endl; // 4 - indicele lui *p în tabloul v