Să considerăm declarația int v[11];
. Care este efectul acestei instrucțiuni?
- se alocă spațiu pentru
11
date de tipint
, într-o zonă continuă de memorie. Aceasta înseamnă că, tipulint
fiind reprezentat pe4
octeți, adresa elementuluiv[1]
este cu4
mai mare decât a elementuluiv[0]
, adresa elementuluiv[2]
este cu4
mai mare decât a elementuluiv[1]
, etc. - se alocă memorie pentru variabila
v
; aceasta este un pointer, a cărui valoare va fi adresa luiv[0]
. Altfel spus,v == &v[0]
! În plus,v
este un pointer constant. Orice atribuire de formav = &...
va duce la eroare de compilare.
Să considerăm un pointer int * p;
. El este de fapt de același tip cu v
, doar că la adresa memorată în p
nu există o variabilă de tip int
.
În schimb:
p = v;
Atribuirea este corectă. În acest moment, p
memorează adresa lui v[0]
; mai mult, asupra lui p
putem aplica operații de indexare:
p[2] = 5; cout << v[2]; // 5
Mai mult:
for(int i = 0 ; i < 11 ; i ++) v[i] = i * 10; p = & v[5]; cout << p[0] << endl; // v[5], adică 50 cout << p[1] << endl; // v[6], adică 60 cout << p[-1] << endl; // v[4], adică 40 !!!!!
Utilizarea pointerilor și tablourilor devine și mai interesantă dacă folosim Aritmetica pointerilor!