Masive de pointeri si masive multidimensionale
Adesea se creeaza confuzii in ceea ce priveste diferenta dintre un masiv bidimensional si un masiv de pointeri. Fie date declara# 343b11d 5;iile:
int a[10][10];
int *b[10];
In aceasta declaratie a este un masiv de intregi caruia i se aloca spatiu pentru toate cele 100 de elemente, iar calculul indicilor se face in mod obisnuit pentru a avea acces la oricare element al masivului.
Pentru masivul b, declaratia aloca spatiu numai pentru zece pointeri, fiecare trebuind sa fie incarcat cu adresa unui masiv de intregi.
Presupunind ca fiecare pointer indica un masiv de zece elemente inseamna ca ar trebui alocate inca o suta de locatii de memorie pentru elementele masivelor.
In aceasta acceptiune, folosirea masivelor a si b poate fi similara in sensul ca a[5][5] si b[5][5], de exemplu, se refera ambele la unul si acelasi intreg (daca fiecare element b[i] este initializat cu adresa masivului a[i]
Astfel, masivul de pointeri utilizeaza mai mult spatiu de memorie decit masivele bidimensionale si pot cere un pas de initializare explicit. Dar masivele de pointeri prezinta doua avantaje, si anume: accesul la un element se face cu adresare indirecta, prin intermediul unui pointer, in loc de procedura obisnuita folosind inmultirea si apoi adunarea, iar al doilea avantaj consta in aceea ca dimensiunea masivelor pointate poate fi variabila. Acest lucru inseamna ca un element al masivului de pointeri b poate indica un masiv de zece elemente, altul un masiv de doua elemente si altul de exemplu poate sa nu indice nici un masiv.
Cu toate ca problema prezentata in acest paragraf am descris-o in termenii intregilor, ea este cel mai frecvent utilizata in memorarea sirurilor de caractere de lungimi diferite (ca in functia month_name prezentata mai sus).
|