Arrays in C
Șiruri (Vectori)
- Un șir este o secvență de date de același tip, indexate și memorate continuu.
- Se folosesc pentru reprezentarea unui număr mare de valori omogene.
- O declarație obișnuită de șir alocă memorie începând de la o adresă de bază.
Șiruri Uni-dimensionale
- Declararea unui șir de întregi:
int a[3]; - Elementele șirului:
a[0],a[1],a[2] - O declarație de șir uni-dimensional este un tip, urmat de un identificator și paranteze pătrate cu o expresie întreagă constantă.
- Valoarea constantei (pozitivă) reprezintă lungimea șirului și specifică numărul de elemente.
- Compilatorul rezervă spațiu de memorie corespunzător, pornind de la o adresă de bază. Dimensiunea este calculată ca numărul de elemente înmulțit cu numărul de octeți necesari pentru memorarea unui element.
- Dacă un șir este declarat fără lungime și inițializat, lungimea sa este implicit numărul de valori inițiale.
- Accesarea unui element:
a[i]saua[expresie], undeieste indexul (între 0 și lungime-1).
Relația dintre vectori și pointeri
- Numele unui șir (ex: "a") este o adresă, deci poate fi privit ca un pointer.
- Șirurile și pointerii pot fi priviți similar în accesarea memoriei.
- La declararea unui șir, compilatorul alocă adresa de bază și spațiu pentru toate elementele.
Șiruri ca argumente pentru funcții
- Un parametru formal declarat ca șir este de fapt un pointer. Se trimite adresa de bază, nu elementele copiate.
- Se permite folosirea parantezelor pătrate în declararea șirurilor ca parametri.
- Exemplu:
c int suma (int a[], int n) /* n dimensiunea sirului */ { int i, S = 0; for (i = 0; i < n; ++i) S += a[i]; return s; } - Apeluri și ce se calculează:
suma(v, 100)calculeazăsuma(v, 88)calculeazăsuma(v + 7, 2 * k)calculează
Șiruri Multidimensionale
- Limbajul C permite șiruri de orice tip, inclusiv șiruri de șiruri.
int a[100];// șir de dimensiune 1int b[2][7];// șir de dimensiune 2int c[5][3][2];// șir de dimensiune 3
- Elementele sunt memorate continuu în memorie.
- Un tablou bidimensional este un tablou unidimensional ale cărui elemente sunt tablouri unidimensionale. Indicii se scriu
b[i][j]. - Exemplu:
int a[3][5];Compilatorul alocă spațiu continuu pentru 15 întregi.
Șiruri de Caractere
- Un caracter dintr-un șir de caractere
ase accesează prin index (a[i]) sau pointeri. - Un șir de caractere se termină cu marcatorul
'\0'(caracterul nul). - Exemplu: "abc" este memorat pe 4 caractere (inclusiv
'\0').
Inițializarea Șirurilor de Caractere
- Element cu element:
c char w[100]; w[0] = 'A'; w[1] = 'B'; w[2] = 'C'; w[3] = '\0'; - Cu
scanf():scanf("%s", w);- Se citesc caractere până la
<Enter>, EOF sau spațiu, și se adaugă'\0'la sfârșit. weste echivalent cu&w[0].
- Se citesc caractere până la
- Direct:
c char s[] = "abc";- Echivalent cu:
char s[] = {'a', 'b', 'c', '\0'};
- Echivalent cu:
'a'(constanta caracter) este diferit de"a"(constanta șir de caractere:'a' + '\0').
Biblioteca standard <string.h>
- Funcții utile pentru lucrul cu șiruri de caractere (terminate cu
'\0'). char *strcat(char *s1, const char *s2);: concateneazăs2las1(programatorul trebuie să asigure spațiu suficient îns1). Returneazăs1.int strcmp(const char *s1, const char *s2);: compară lexicografics1cus2. Returnează un întreg (char *strcpy(char *s1, const char *s2);: copiazăs2îns1(până la'\0'). Programatorul trebuie să asigure spațiu suficient îns1.unsigned strlen(const char *s);: returnează numărul de caractere înaintea lui'\0'.