Wednesday, November 15, 2017

Expresii cu variabile pointer la referirea elementelor din masive

Dacă cineva vrea să folosescă în programe construcții omogene și în program să apară preponderent lucru cu variabile pointer, are mii de posibilități să facă acest lucru lejer, frumos și interesant.
Un programator va scrie secvența:
int x[100];
int i, n, s=0;
..............
for(i=0, i<n, i++) s+=x[i];
...............
dar tot at\t de bine, folosind faptul v[ v este de fapt un pointer spre o zonă de memorie de 100 de cuvinte alocate la definire, folosind variabila pointer v se va scrie:

for(i=0, i<n, i++) s+=*(x+i);
Aritmetica de pointeri arată că variabila i se incrementeaz[ cu lungimea unui cuvânt.
parantezele rotunde au prioritatea 1, deci ele se evaluează primele, ceea ce înseamnă că la adresa lui x se adună de i ori lungimea unui cuvânt, ceea ce duce la aflarea adresei elementului al i-lea din vector. Operatorul de referire are prioritatea 2 ceea ce înseamnă că se execută după evaluarea expresiei din paranteze. Deci referirea înseamnă extragerea conținutului din zona de memorie a cărei adresă a fost calculată.
Dacă se lucrează cu masive bidimensionale lucrurile stau tot așa, ceea ce permite și o generalizare.
int xx[17][12];
int i, j, n=9, m=11, s=0;
..............
for(i=0, i<n, i++) 
for(j=0, i<m, i++) s+=xx[i][j];
...............
Masivul bidimensional xx este de fapt o variabilă pointer spre pointer, adică are dpuă niveluri de indirectare. În loc de xx[i][j] se va scrie *(*(xx+i)+j) și aplicând regulile de de parcurgere de la stânga spre dreapta și restricțiile de la aritmetica de pointeri se va obține adresa elementului xx[i][j]. Se știe că xx+i înseamnă că la adresa lui xx se adaugă 12 de înmulțit cu lungimea cuvântului, așa cum este definită variabila de tip întreg. Se obține adrea de început a liniei i din matrice. Apoi se adaugă deplasarea elementului j și primul * din partea stângă ca permite referitea elementului de la acea adresă, adică a elementului xx[i][j], cum cere algoritmul de evaluare a sumei elementelor unei matrice. Pentru un masiv tridimensional definit prin:
int yy[17][12][18];
referirea elementului yy[i][j][k] se va realiza folosind variabila pointer yy care are trei niveluri de indirectare cu expfresia:
*(*(*((yy+i)+j)+k). 
.......
for(i=0, i<n, i++) 
for(j=0, i<m, i++) s+=*(*(*((yy+i)+j)+k);
Frumos, nu?
Lucrul cu aceste expresii este perfect în momentul în care are loc alocarea dinamică a masivelor uni, bi și tridimensionale, ceea ce dă o mare șansă programatorilor de a ameliora gradul de ocupare al zonelor de memorie.

(15 noiembrie 2017)

No comments:

Post a Comment