Pointeri și tablouri

Deși pot părea fundamental diferite, cele două concepte sunt, în C++ foarte asemănătoare. Practic, tablourile sunt pointeri către primul element și pot fi convertite, implicit, la acest tip.

Exemplul următor este, deci, complet funcțional: int t[10]], *pt; pt=t; După atribuirea pt=t, cele două variabile vor fi, în mare măsură, echivalente. Diferența constă în aceea că variabilei pt i se poate atribui, ulterior altă adresă, pe când variabila t va indica tot timpul către acelaşi bloc de memorie alcătuit din 10 locaţii de dimensiunea int. Ca urmare, o atribuire de forma t=pt, nu va fi validată.

Să analizăm exemplul următor: int numere[5]; int * p; p = numere; *p = 10; p++; *p = 20; p = &numere[2]; *p = 30; p = numere + 3; *p = 40; p = numere; *(p+4) = 50; for (int n=0; n<5; n++) cout << numere[n] << ", "; În exemplu, tabloul numere este actualizat prin pointerul p, care face, progresiv, referinta la componentele sale. În urma atribuirii p=numere, pointerul va avea valoarea adresei primului element al tabloului. Prin intermediul operatorului de dereferențiere valoarea 10 este plasată în zona de memorie corespunzătoare. Ulterior, pointerul p avansează la adresa următoare, prin instrucțiunea p++, indicând adresa elementului de indice 1, căruia, prin același mecanism i se atribuie valoarea 20. Asemănător, pointerul avansează la adresele de memorie ale tuturor componentelor vectorului, determinând plasarea valorilor 30, 40, 50. Astfel, la afișare, vom obține, în ordine, valorile 10, 20, 30, 40, 50.

Pointerii și tablourile acceptă aceleași operații, cu aceleași semnificații. Principala diferență, între cele două tipuri de date, este dată de faptul că pointerilor li se pot atribui noi adrese, în tip ce pentru tablouri, adresele sunt fixe.

În capitolul despre tablouri am vorbit despre parantezele drepte, [ ], precizând că sunt folosite pentru a preciza indexul unui element al tabloului. De fapt, acum putem spune că acestea sunt un operator de dereferențiere, cunoscute ca offset operator. Astfel, expresiile următoare sunt echivalente: a[1]=0; *(a+1)=0;