Pointeri la caracter si functii
O constanta sir, de exemplu:
este un masiv de caractere, care in reprezentarea interna este terminat cu caracterul , astfel incit programul poate depista sfirsi 959e42j tul lui. Lungimea acestui sir in memorie este astfel cu 1 mai mare decit numarul de caractere ce apar efectiv intre ghilimelele de inceput si sfirsit de sir.
Cea mai frecventa aparitie a unei constante sir este ca argument la functii, caz in care accesul la ea se realizeaza prin intermediul unui pointer.
In exemplul:
printf('Buna dimineatan');
functia printf primeste de fapt un pointer la masivul de caractere.
In prelucrarea unui sir de caractere sint implicati numai pointeri, limbajul C neoferind nici un operator care sa trateze sirul de caractere ca o unitate de informatie.
Vom prezenta citeva aspecte legate de pointeri si masive analizind doua exemple. Sa consideram pentru inceput functia strcpy(s,t) care copiaza sirul t peste sirul s. O prima versiune a programului ar fi urmatoarea:
strcpy(char s[], char t[])
O a doua versiune cu ajutorul pointerilor este urmatoarea:
strcpy(char *s, char *t)
Aceasta versiune cu pointeri modifica prin incrementare pe s si t in partea de test. Valoarea lui *t++ este caracterul indicat de pointerul t, inainte de incrementare. Notatia postfix asigura ca t va fi modificat dupa depunerea continutului indicat de el, la vechea pozitie a lui s, dupa care si s se incrementeaza. Efectul este ca se copiaza caracterele sirului t in sirul s pina la caracterul terminal inclusiv.
Am mai putea face o observatie legata de redundanta compararii cu caracterul , redundanta care rezulta din structura instructiunii while
Si atunci forma cea mai prescurtata a functiei strcpy(s,t) este:
strcpy(char *s, char *t)
Sa consideram, ca al doilea exemplu, functia strcmp(s,t) care compara caracterele sirurilor s si t si returneaza o valoare negativa, zero sau pozitiva, dupa cum sirul s este lexicografic mai mic, egal sau mai mare ca sirul t. Valoarea returnata se obtine prin scaderea caracterelor primei pozitii in care s si t difera.
strcmp(char s, char t)
Versiunea cu pointeri a aceleiasi functii este:
strcmp(char *s, char *t)
In final prezentam functia strsav care copiaza un sir dat prin argumentul ei intr-o zona obtinuta printr-un apel la functia alloc. Ea returneaza un pointer la sirul copiat sau NULL, daca nu mai exista suficient spatiu pentru memorarea sirului.
char *strsav(char *s)
|