Array, Stringhe C-Style e Cicli
Spesso non basta manipolare una singola variabile, ma occorre raggruppare informazioni omogenee. In C++, lo strumento basilare per farlo è l’array.
Gli Array
Section titled “Gli Array”Un array è una sequenza di variabili dello stesso tipo disposte in modo contiguo in memoria. Si dichiarano specificando il tipo degli elementi seguito da parentesi quadre contenenti la dimensione:
int mio_array[100]; // Un array di 100 interiInizializzazione
Section titled “Inizializzazione”Esiste una comoda scorciatoia sintattica per pre-riempire l’array al momento della dichiarazione, utilizzando le parentesi graffe { }:
int numeri[] = { 10, 20, 30, 40 };In questo caso, omettendo il numero nelle parentesi quadre [], il compilatore inferisce automaticamente che l’array ha dimensione 4, contando gli elementi nella lista.
Accesso agli Elementi
Section titled “Accesso agli Elementi”Si accede agli elementi di un array utilizzando le parentesi quadre. L’indicizzazione in C++ è a base zero: il primo elemento è all’indice 0, il decimo all’indice 9 e così via.
int primo = numeri[0]; // Vale 10numeri[2] = 99; // Ora il terzo elemento (30) diventa 99I Cicli for
Section titled “I Cicli for”Per ripetere un’azione su tutti gli elementi di un array, la struttura di controllo ideale è il ciclo for. Esso possiede tre parti:
- Inizializzazione: eseguita una sola volta prima del ciclo (es. creazione dell’indice
i). - Condizione: valutata prima di ogni iterazione. Se vera, il ciclo continua; se falsa, termina.
- Iterazione: eseguita alla fine di ogni iterazione (es. incremento
i++).
for (size_t i = 0; i < 4; i++) { printf("Valore: %d\n", numeri[i]);}(Usiamo size_t al posto di int per l’indice i perché, teoricamente, l’array potrebbe occupare tutta la RAM del computer e size_t è l’unico tipo in grado di indicizzare in modo sicuro l’intera memoria, anche se int funziona nella stragrande maggioranza dei casi).
Esercizio: Trovare il Massimo (Range-Based For)
Section titled “Esercizio: Trovare il Massimo (Range-Based For)”Il C++ moderno supporta una sintassi molto più pulita ed espressiva per iterare sull’intero contenuto di un array senza gestire indici manuali: il range-based for loop.
Prova a completare questo esercizio usando il range-based for per trovare il valore massimo nell’array.
Lunghezza di un Array con sizeof
Section titled “Lunghezza di un Array con sizeof”Prima del C++ moderno, un trucco diffusissimo per calcolare a tempo di compilazione il numero di elementi di un array consisteva nel dividere la dimensione totale dell’array per la dimensione del suo primo elemento:
short array[] = { 104, 105, 32, 98, 105, 108, 108, 0 };size_t n_elementi = sizeof(array) / sizeof(short); // Restituisce 8Questo trucco è veloce, ma funziona solo per gli array grezzi (C-style arrays) di cui il compilatore conosce la grandezza a compile-time nello stesso scope. In futuro scoprirai le classi container del C++ (std::vector, std::array) che offrono un metodo .size() molto più sicuro.
Le Stringhe “C-Style”
Section titled “Le Stringhe “C-Style””Nel C++, una stringa di testo di base (ereditata dal C) non è altro che un array di caratteri contigui in memoria, terminato da un byte speciale con valore zero, detto terminatore null o carattere \0.
Questa terminazione silenziosa segnala a funzioni come printf che la stringa è finita.
String Literals
Section titled “String Literals”Puoi dichiarare un array testuale usando la sintassi delle virgolette doppie (" "):
char lingua[] = "C++";Sotto il cofano, l’array lingua è composto da 4 elementi, non 3: 'C', '+', '+', e il terminatore null '\0'.
Concatenazione di String Literals
Section titled “Concatenazione di String Literals”Se inserisci più blocchi di testo tra virgolette di seguito, separati solo da spazi o andate a capo, il compilatore C++ li incollerà automaticamente in un’unica stringa. È utilissimo per formattare lunghi testi:
char libro[] = "Un libro " "costruisce una " "casa d'oro.";Per stampare a video queste stringhe con printf, si utilizza lo specificatore di formato %s (string).