Tablouri (array) în C

Un șir de elemente de același tip, așezate unul după altul în memorie și accesate prin index, de la 0.

Sintaxă
tip nume[dimensiune];
tip nume[] = {v1, v2, v3};
tip nume[dimensiune] = {[index] = valoare};   // C99

Ce face Tablouri (array)

Un tablou (array) păstrează mai multe valori de același tip într-o zonă continuă de memorie. Declari tipul, numele și numărul de elemente: int note[5];. Primul element este note[0], ultimul note[4].

Dimensiunea unui tablou este fixă: nu poate crește după declarare. Dacă îl inițializezi cu acolade, poți lăsa dimensiunea goală și compilatorul o numără singur. Elementele neinițializate dintr-o listă cu acolade devin 0, iar int t[10] = {0}; pune zero peste tot. Din C99 poți inițializa doar anumite poziții: {[3] = 7}.

Numărul de elemente se află cu sizeof t / sizeof t[0], dar doar acolo unde t este chiar tabloul. Când trimiți un tablou unei funcții, ea primește de fapt un pointer la primul element și nu mai știe dimensiunea, așa că o trimiți ca parametru separat.

Parametri

Parametru Descriere
tip Tipul fiecărui element (int, double, char, un struct).
dimensiune Numărul de elemente; trebuie să fie mai mare decât 0.

Exemple

Exemplul 1: Media notelor

Numărul de elemente este calculat cu sizeof, așa că bucla rămâne corectă dacă adaugi o notă în listă.

#include <stdio.h>

int main(void) {
    int note[] = {9, 7, 10, 8, 6};
    size_t n = sizeof note / sizeof note[0];
    int suma = 0;
    for (size_t i = 0; i < n; i++) {
        suma += note[i];
    }
    printf("Ana are %zu note, media %.2f\n", n, (double)suma / (double)n);
    return 0;
}

Rezultat

Ana are 5 note, media 8.00

Exemplul 2: Inițializare parțială și inițializatori desemnați

Pozițiile care nu primesc valoare devin 0. [2] = 45 pune valoarea direct la indexul 2.

#include <stdio.h>

int main(void) {
    int stoc[6] = {3, 1};             // restul devin 0
    int preturi[5] = {[2] = 45, [4] = 120};
    for (int i = 0; i < 6; i++) printf("%d ", stoc[i]);
    printf("\n");
    for (int i = 0; i < 5; i++) printf("%d ", preturi[i]);
    printf("\n");
    return 0;
}

Rezultat

3 1 0 0 0 0 
0 0 45 0 120

Exemplul 3: Un tablou trimis unei funcții

Funcția primește un pointer și dimensiunea separat. Modificările făcute în funcție se văd și în main, pentru că se lucrează pe aceleași elemente.

#include <stdio.h>

void scumpeste(int preturi[], size_t n, int procent) {
    for (size_t i = 0; i < n; i++) {
        preturi[i] += preturi[i] * procent / 100;
    }
}

int main(void) {
    int preturi[] = {100, 250, 40};
    size_t n = sizeof preturi / sizeof preturi[0];
    scumpeste(preturi, n, 10);
    for (size_t i = 0; i < n; i++) {
        printf("%d lei\n", preturi[i]);
    }
    return 0;
}

Rezultat

110 lei
275 lei
44 lei

Greșeli frecvente

  • Accesezi t[n] într-un tablou cu n elemente. Indexul maxim este n - 1; C nu verifică limitele, iar citirea sau scrierea în afara tabloului este comportament nedefinit.
  • Folosești sizeof t / sizeof t[0] într-o funcție care a primit tabloul ca parametru. Acolo t este un pointer, iar rezultatul este dimensiunea pointerului împărțită la cea a elementului, nu numărul de elemente.
  • Încerci să copiezi un tablou cu a = b;. Tablourile nu se pot atribui; copiază element cu element sau cu memcpy.

Comenzi înrudite

  • Tablouri bidimensionale (matrice): Un tablou de tablouri: date așezate pe rânduri și coloane, accesate cu doi indici, m[rând][coloană].
  • Șiruri de caractere (char[]): În C, un șir de caractere este un tablou de char terminat cu caracterul nul ‘\0’, care marchează sfârșitul textului.
  • Aritmetica pointerilor: Adunarea și scăderea pe pointeri se fac în elemente, nu în octeți: p + 1 arată spre următorul element din tablou.
  • sizeof: Operatorul care spune câți octeți ocupă un tip sau o variabilă; calculat de compilator, rezultatul are tipul size_t.
  • for: Bucla cu contor: inițializare, condiție verificată înainte de fiecare pas și actualizare, toate pe un singur rând.
  • memcpy: Copiază n octeți dintr-o zonă de memorie în alta; zonele nu au voie să se suprapună.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Tablouri (array)

Ai o nelămurire despre utilizarea comenzii Tablouri (array) sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.