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] sau a[expresie], unde i este 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ă v[0] + v[1] + … + v[99]
    • suma(v, 88) calculează v[0] + v[1] + … + v[87]
    • suma(v + 7, 2 * k) calculează v[7] + v[8] + … + v[2k+6]

Șiruri Multidimensionale

  • Limbajul C permite șiruri de orice tip, inclusiv șiruri de șiruri.
    • int a[100]; // șir de dimensiune 1
    • int b[2][7]; // șir de dimensiune 2
    • int 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 a se 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

  1. Element cu element:
    c char w[100]; w[0] = 'A'; w[1] = 'B'; w[2] = 'C'; w[3] = '\0';
  2. Cu scanf(): scanf("%s", w);
    • Se citesc caractere până la <Enter>, EOF sau spațiu, și se adaugă '\0' la sfârșit.
    • w este echivalent cu &w[0].
  3. Direct:c char s[] = "abc";
    • Echivalent cu: char s[] = {'a', 'b', 'c', '\0'};
  • '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ă s2 la s1 (programatorul trebuie să asigure spațiu suficient în s1). Returnează s1.
  • int strcmp(const char *s1, const char *s2);: compară lexicografic s1 cu s2. Returnează un întreg (
  • char *strcpy(char *s1, const char *s2);: copiază s2 în s1 (până la '\0'). Programatorul trebuie să asigure spațiu suficient în s1.
  • unsigned strlen(const char *s);: returnează numărul de caractere înaintea lui '\0'.