8. Pointeri
2019/03/02 in Programare in C
Un pointer este o variabila care are ca valori adrese.
Pointerii se utilizeaza pentru a face referire la date cunoscute prin adresele lor.
Astfel, daca p este o variabila de tip pointer care are ca valoare adresa lui x,
atunci *p
reprezinta chiar valoarea lui x.
Fie, de exemplu:
int x,y;
atunci, daca p are ca valoare adresa lui x, atribuirea:
y = x + 100;
este identica cu:
y = *p + 100;
In mod analog, atribuirea:
x = 3;
este identica cu:
*p = 3;
In constructia *p de mai sus, caracterul * se considera ca fiind un operator unar care furnizeaza valoarea din zona de memorie a carei adresa este continuta in p.
Operatorul unar * are aceeasi prioritate ca si ceilalti operatori unari din limbajul C si se asociaza de la dreapta spre stanga (vezi 3.2.16.).
Daca p contine adresa unei zone de memorie alocata lui x, vom spune ca p pointeza spre x.
De asemenea, daca p are ca valoare adresa de inceput a unei zone de memorie care contine o data de tipul tip, atunci vom spune ca p pointeza spre tip.
Mentionam ca in legatura cu notiunea de pointer, in limba romana se mai utilizeaza si alte denumiri, ca de exemplu:
- referinta;
- localizator;
- reper;
- indicator de adresa etc.
In continuare vom utiliza denumirea englezeasca.
Pentru a atribui o adresa unei variabile de tip pointer se poate folosi operatorul unar & (vezi 3.2.11.). Astfel, daca dorim ca p sa pointeze spre x (sa aiba ca valoare adresa lui x), atunci putem utiliza atribuirea:
p = &x
Operatorul unar & este numit operator adresa sau de referentiere. Operatorul unar * il vom numi operator de indirectare sau de dereferentiere.
Ultima denumire a operatorului unar * decurge din efectul invers al acestuia fata de operatorul unar &. Intr-adevar, expresia:
*&x
are aceeasi valoare cu x.
Exemplu:
Fie declaratia:
int x;
Variabilei x i se atribuie o zona de memorie de 16 biti:
Fie 1000 adresa zonei de memorie alocate variabilei x.
Daca p este o variabila pointer, atunci ei i se atribuie, de asemenea, o zona de memorie de 16 biti (vom vedea ulterior ca ea poate fi de 32 biti):
Folosind instructiunea de atribuire:
p = &x;
lui p i se atribuie valoarea 1000:
Instructiunea:
x = 10;
atribuie lui x valoarea 10:
Acelasi efect se obtine folosind instructiunea:
*p = 10;
In concluzie, instructiunea:
x = 10;
este echivalenta cu secventa:
p = &x;
*p = x;
sau
p = &x, *p = x;
Notiunea de pointer joaca un rol important deoarece permite calcule cu adrese. Acestea sunt utile mai ales in scrierea programelor de sistem. Astfel de calcule sunt proprii limbajelor de asamblare. Introducerea lor in limbajul C ofera programatorilor posibilitatea de a scrie programe mai optime decat cele realizate fara a beneficia de facilitatile oferite de pointeri.
Un beneficiu obtinut simplu pe baza utilizarii pointerilor este inlocuirea expresiilor cu indici prin expresii cu pointeri. Ca efect, inmultirile utilizate la evaluarea variabilelor cu indici se schimba cu adunari si deplasari. Un alt beneficiu este posibilitatea alocarii dinamice a memoriei prin alte mijloace decat cel utilizat la alocarea datelor automatice.
Folosirea functiilor ca parametri este si el un beneficiu al utilizarii pointerilor.