Structuri
O structură este o colecţie de valori eterogene stocată într-o zonă de memorie compactă. O structură este compusă din una sau mai multe elemente, numite câmpuri, în care fiecare câmp are propriul său nume şi tip. Memoria alocată unei structuri este o secvenţă continuă de locaţii, câte o locaţie pentru fiecare câmp. Câmpurile sunt numite şi membri ai structurii sau elemente ale structurii. Ordinea de memorare a câmpurilor corespunde cu ordinea de descriere a acestora în cadrul structurii. Structurile permit organizarea datelor complexe, permiţând ca un grup de variabile legate să fie tratate ca o singură entitate.
O structură are următorul format general:
struct nume_structura
{
tip nume_camp_1;
tip nume-camp_2;
} [lista_variabile_structura];
Exemplu:
//definim structura cu numele data_calendaristica
struct data_calendaristica {
int zi;
int luna;
int an;
} d; //variabila d va fi de tip structura data_calendaristica
//definim variabilele data_angajarii, data_nasterii de tip structura data_calendaristica
struct data_calendaristica data_angajarii, data_nasterii;
Câmpuri de biţi
Câmpurile de biţi permit accesul la nivel de bit pentru elementele acestui tip de structură. Deoarece în C nu există tipul boolean, astfel se pot stoca mai multe variabile booleene (adevărat sau fals, 1 sau o) utilizând un singur octet.
De fapt, un câmp de biţi este un tip special de structură, care precizează cât de lung trebuie să fie fiecare câmp, lungime exprimată în biţi.
Formatul general pentru definirea unui câmp de biţi este:
struct nume_generic
{
tip nume1:lungime;
tip nume2:lungime;
...
tip numen: lungime;
} lista_variabile;
Tipul trebuie să fie int, unsigned sau signed. Câmpul de biţi cu lungimea 1 trebuie să fie declarat ca fiind unsigned deoarece un singur bit nu poate avea semn. Numărul de biţi dintr-un câmp este specificat prin lungime. Câmpurile de biţi sunt folosite frecvent la analizarea intrării de la un echipament hardware sau pentru diverse rutine de criptare care trebuie să aibă acces la biţii unui octet.
Exemplu:
struct angajat
{
struct date_pers datep;
float salar;
unsigned activ: 1;
unsigned orar:i;
}ang;
Uniuni
O uniune este o locaţie de memorie care este împărţită în momente diferite între două sau mai multe variabile diferite, în general de tipuri diferite.
Formatul general al declaraţiei unei uniuni este:
union nume_generic
{
tip nume_variabilă;
tip nume_variabilă;
...
} variabile_uniune;
Exemplu:
union exemplu_uniune
{
int i;
char ch;
};
//declarăm variabila eu de tipul uniune definit mai sus
union exemplu_uniune eu;
Când este declarată o variabilă de tip uniune, compilatorul alocă automat memorie suficientă’pentru a păstra cel mai mare membru al acesteia. Evidenţa dimensiunilor şi a aliniamentului o va ţine compilatorul.
Enumerări
O enumerare este un set de constante care specifică toate valorile permise pe care le poate avea o variabilă de acel tip.
Formatul general de declarare a unei enumerări este:
enum nume_generic {lista enumerărilor} lista_variabile_enumerare;
Exemplu:
enum curcubeu {roşu, orange, galben, verde, albastru, indigo, violet};
enum curcubeu ec;
Fiecare dintre simboluri ţine locul unei valori întregi. Fiecare in ele poate fi folosit oriunde poate fi utilizat un întreg. Valoarea primului simbol al enumerării este implicit 0.
printf(" %d %d\n", roşu, verde); va afişa 0 2.
Asupra unei variabile enumerare se pot face atribuiri:
ec=albastru;
sau valoarea lor poate fi comparată cu una din valorile din enumerare:
if (ec==albastru) printf("Albastru!\n");
Pentru a specifica valoarea unuia sau mai multor simboluri putem folosi iniţializări. Simbolurilor care apar după iniţializare li se atribuie automat valori ce urmează după acea valoare.
enum curcubeu {roşu, orange, galben=ioo, verde, albastru, indigo, violet} ec;
printf("%d %d\n", verde,violet); //va afişa 101 104.