Skip to content

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.

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 interi

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.

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 10
numeri[2] = 99; // Ora il terzo elemento (30) diventa 99

Per ripetere un’azione su tutti gli elementi di un array, la struttura di controllo ideale è il ciclo for. Esso possiede tre parti:

  1. Inizializzazione: eseguita una sola volta prima del ciclo (es. creazione dell’indice i).
  2. Condizione: valutata prima di ogni iterazione. Se vera, il ciclo continua; se falsa, termina.
  3. 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.

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 8

Questo 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.

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.

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'.

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).