Tablourile de memorie cu o dimensiune (vectori)

Deoarece numele unui tablou de memorie este o constantă de tip adresă, în manipularea elementelor unui tablou de memorie, numele tabloului poate fi tratat ca un pointer.

Numele vectorului poate fi considerat ca un pointer, cu tipul de bază al elementelor vectorului, care indică primul element al vectorului, iar numele vectorului poate fi atribuit ca valoare unui pointer.

Exemplu

int a[20], *p;

Următoarele operaţii de atribuire sunt echivalente:
p=a ↔ p=&a ↔ p=&a[0]
şi
*p ↔ a[0]

Notă

p=a; (Corect! unui pointer i se poate atribui o constantă de tip adresă)
a=p; (Eroare! valoarea unei constante nu poate fi modificată).

Aşadar, pointerului p i se poate atribui adresa vectorului a exprimată prin:
-> constanta simbolică de tip adresă a
-> operatorul de adresare & aplicat pe numele variabilei a
-> operatorul de adresare & aplicat pe numele primului element al vectorului – a[0].

Tablouri de memorie cu o dimensiune (vectori)

Prin definiţie, operatorul indice al tabloului ([]):
-> se aplică pe doi operanzi x şi y (x[y] sau y[x]), x fiind un pointer şi y un întreg
-> realizează adunarea dintre pointerul x şi constanta y, obţinând adresa elementului y al vectorului de la adresa x.
-> rezultatul furnizat este valoarea indicată de pointerul obţinut, adică valoarea elementului y al vectorului de adresă x
-> expresiile următoare sunt echivalente: x[y] ↔ y[x] ↔ *(x+y).

Aşadar, elementul i al vectorului a poate fi indentificat prin a[i], deoarece operatorul indice al tabloului ([ ]) execută suma dintre pointerul a, o adresă, şi constanta numerică i. Prin aplicarea acestui operator se obţine adresa elementului i.

Dar, elementul i al unui vector poate fi localizat şi folosind numele tabloului ca un pointer. Deoarece operaţia de adunare dintre un pointer şi o constantă este comutativă, următoarele expresii sunt echivalente şi se pot folosi pentru identificarea elementului i al vectorului:
a[i] ↔ *(a+i) ↔ *(i+a) ↔ i[a]

La definirea unui pointer trebuie precizat şi tipul de bază. Tipul de bază al unui pointer poate fi şi un vector, astfel încât definiţia următoare este corectă:
int a[20], *p=a, (*q)[20]=a;

Pointerul p are tipul de bază int, iar pointerul q are tipul de bază int [20], adică pointer către un vector cu 20 de elemente de tip int.

Ambii pointeri conţin aceeaşi adresă: adresa vectorului a.

Cei doi pointeri se deosebesc prin unitatea folosită în calcul pentru operaţiile aritmetice: în cazul pointerului p unitatea este sizeof(int) = 2 octeţi, iar în cazul pointerului q unitatea este 20 x sizeof(int) = 40 octeţi.

Putem spune că, în general, unitatea folosită în operaţiile aritmetice de un pointer către un vector cu n elemente cu tipul tip_baza este de n x sizeof(tip_baza) octeţi.


Tablourile de memorie cu o dimensiune (vectori) publicat: 2017-09-22T13:53:24+00:00, actualizat: 2017-09-22T13:53:24+00:00 by Colegiu.info