Pointeri la structuri
Pentru a ilustra citeva din consideratiile referitoare la
pointeri si tablouri de structuri sa rescriem programul de
contorizare a cuvintelor cheie, de data aceasta folosind pointer 14414p151o ii
in loc de indici.
Declaratia externa "keytab" nu necesita modificari, dar
"main" si "binary" necesita.
main() /* count keywords; pointer version */
struct key *binary(word, tab, n) /* find word */
char *word; /* in tab[0]...tab[n-1] */
struct key tab[];
int n;
return(NULL);
}
Aici sint mai multe chestiuni de notat. Prima, declaratia
"binary" trebuie sa indice ca e returneaza un pointer
structurii tip "key" in locul unui intreg. Acesta este declarat
in "main" cit si in "binary". Daca "binary" gaseste cuvintul,
returneaza un pointer; daca acesta lipseste, returneaza NULL.
A doua, orice acces la elementele lui "keytab" sint facute
prin pointeri. Aceasta determina o schimbare semnificativa in
"binary calculul poate fi simplu.
mid = (low + high) / 2
deoarece adunarea a doi pointeri nu va produce nici un
fel de raspuns utilizabil si de fapt este ilegala. Aceasta trebuie
schimbata in
mid = low + (high - low) / 2
care seteaza "mid" in punctul de la jumatatea intre "low" si
"high".
Ar trebui sa studiati si initializatorii pentru "low" si "high"
Este posibil sa se initializeze un pointer la adresa unui obiect
definit dinainte; aceasta am facut noi aici.
In "main" am scris:
for (p = keytab; p < keytab + NKEYS; p++)
Daca p este un pointer la structura, orice operatie aritmentica
asupra lui p tine cont de dimnesiunea actuala a structurii,
astfel p++ incrementeaza p cu cantitatea corecta pentru a obtine
urmatorul element al tabloului de structuri. Dar sa nu credeti
ca dimensiunea structurii este suma dimensiunilor membrilor sai
deoarece aliniamentul cerut pentru diferiti membri pot determina
aparitia de "gauri" in structura.
Si in final o consideratie asupra formatului programului.
Cind o functie f returneaza un tip complicat ca in:
struct key *binary(word, tab, n)
numele functiei este dificil de vazut si de gasit cu un
editor de texte De aceea un alt stil este citeodata folosit.
struct key *
binary(word, tab, n)
Aceasta este mai mult o chestiune de gust personal; luati
forma pe care o doriti si tineti-va de ea.