Initializarea masivelor si masivelor de pointeri
Initializatorul unei variabile declarate masiv consta dintr-o lista de initializatori separati prin virgula si inchisi intre acolade, 616h76g corespunzatori tuturor elementelor masivului. Ei sint scrisi in ordinea crescatoare a indicilor masivului. Daca masivul contine sub-masive atunci regula se aplica recursiv membrilor masivului. Daca in lista de initializare exista mai putini initializatori decit elementele masivului, restul elementelor neinitializate se initializeaza cu zero. Nu se admite initializarea unui masiv de clasa cu automatic.
Acoladele se pot omite in urmatoarele situatii:
– daca initializatorul incepe cu o acolada stinga (
Aceasta declaratie defineste si initializeaza pe x ca un masiv unidimensional cu trei elemente, in ciuda faptului ca nu s-a specificat dimensiunea masivului. Prezenta initializatorilor inchisi intre acolade determina dimensiunea masivului.
2) Declaratia
int y[4][3]=,
,
,
};
este o initializare complet inchisa intre acolade. Valorile 1,3,5 initializeaza prima linie a masivului y[0] si anume pe y[0][0] y[0][1] y[0][2]. In mod analog urmatoarele doua linii initializeaza pe y[1] si y[2]. Deoarece initializatorii sint mai putini decit numarul elementelor masivului, linia y[3] se va initializa cu zero, respectiv elementele y[3][0] y[3][1] y[3][2] vor avea valorile zero.
3) Acelasi efect se poate obtine din declaratia:
int y[4][3] = ;
unde initializatorul masivului y incepe cu acolada stinga in timp ce initializatorul pentru masivul y[0] nu, fapt pentru care primii trei initializatori sint folositi pentru initializarea lui y[0], restul initializatorilor fiind folositi pentru initializarea masivelor y[1] si respectiv y[2]
4) Declaratia:
int y[4][3] = ,,,
};
initializeaza masivul y[0] cu (1,0,0), masivul y[1] cu (2,0,0), masivul y[2] cu (3,0,0) si masivul y[4] cu (4,0,0).
5) Declaratia:
static char msg[] = 'Eroare de sintaxa';
initializeaza elementele masivului de caractere msg cu caracterele succesive ale sirului dat.
In ceea ce priveste initializarea unui masiv de pointeri sa consideram urmatorul exemplu.
Fie functia month_name care returneaza un pointer la un sir de caractere care indica numele unei luni a anului. Functia data contine un masiv de siruri de caractere si returneaza un pointer la un astfel de sir, cind ea este apelata.
Codul functiei este urmatorul:
char *month_name(int n)
return ((n<1) || (n>12)) ? name[0] :
name[n] ;
}
In acest exemplu, name este un masiv de pointeri la caracter, al carui initializator este o lista de siruri de caractere. Compilatorul aloca o zona de memorie pentru memorarea acestor siruri si genereaza cite un pointer la fiecare din ele pe care apoi ii introduce in masivul name. Deci name[i] va contine un pointer la sirul de caractere avind indice i al initializatorului. Dimensiunea masivului name nu este necesar a fi specificata deoarece compilatorul o calculeaza numarind initializatorii furnizati si o completeaza in declaratia masivului.
|