Initializarea tablourilor de pointeri
Sa ne pune problema scrierii unei functii month_name(n) care
returneaza un pointer pe un sir de caractere continind numele a n
linii. Aceasta este o aplicatie ideala pentru un tablou static
intern. month-name contine un tablou propriu de siruri de caracte-
re si returneaza un pointer pe sirul convenabil atunci cind este
apelat. Scopul acestei sectiuni este de a arata cum se initiali-
zeaza tabloul de nume.
Sintaxa este similara cu cea a initializarilor precedente:
char *month-name(n) /*returneaza numele celei de-a n-a luni*/
int n;
;
return((n < 1 || n > 12) ? name[0] : name[n]);
}
Declararea numelui, care este un tablou de pointeri pe caractere
este aceeasi ca si la lineptr, in ex de sortare. Valorile de
initializare sint de fapt o lista de caractere; fiecare dintre
acestea din urma este asignat pozitiei corespunzatoare din tablou.
Mai precis, caracterele celui de-al i-lea sint plasate undeva
iar pointerul pe ele este stocat in name[i]. Daca lungimea
tabloului name nu este specificata, compilatorul numara valorile
de intializare si pune lungimea corecta.
5.10. Comaparatie pointeri. Tablouri multi-dimensionale
Nou venitii in C sint uneori confuzi in legatura cu deosebirea
dintre un tablou bidimensional si un tablou de pointeri cum ar fi
name din exemplul de mai sus. Fiind date declaratiile
int a[10][10];
int *b[10];
utilizarile lui a si b pot fi similare, in sensul ca a[5][5] si
b[5][5] sint ambele referinte legale ale aceluiasi int. Dar
a este un tablou in toata regula: toate cele 100 celule de
memorie trebuie alocate iar pentru gasirea fiecarui element se
face calculul obisnuit al indicelui. Pentru b, oricum prin decla-
rarea se aloca 10 pointeri; fiecare trebuie facut sa pointeze un
tablou de intregi. Presupunind ca fiecare pointeaza cite 10 ele-
mente din tablou, atunci vom obtine 100 celule de memorie rezerva-
te, plus cele 10 celule pt pointeri. Astfel tabloul de pointeri
utilizeaza sensibil mai mult spatiu si poate cere un pro explicit
de initializare. Dar, exista doua avantaje: accesarea unui element
se face indirect prin intermediul unui pointer, in loc sa se faca
prin inmultire si adunare iar liniile tabloului pot fi de lungimi
diferite. Aceasta insemna ca nu orice element al lui b este con-
strins sa pointeze pe un vector de 10 elemente, unii pot pointa
pe cite 2 elemente, altii pe cite 20 si altii pe niciunul.
Desi am mai discutat acest lucru la intregi, de departe,
cea mai frecventa utilizare a tabloului de pointeri este cea
ilustrata prin mounth-name: sa stocheze lanturi de caractere de
lungimi diferite.
Exercitiul 5.6. Rescrieti rutinele day_of_year si mounth-day cu
pointeri in loc de indexare.