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 cunelemente. Indexul maxim esten - 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. Acoloteste 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 cumemcpy.
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ă.
Î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.