# Dal C al C++/Array

Dal C al C++
Copertina Tutti i moduli · Sviluppo
* IntroduzioneDal C al C++/Introduzione
** I destinatari del libroDal C al C++/Introduzione#I destinatari del libro
** La struttura del libroDal C al C++/Introduzione#La struttura del libro
** Impieghi del linguaggioDal C al C++/Introduzione#Impieghi del linguaggio
** PanoramicaDal C al C++/Introduzione#Panoramica
* Utilizzo basilare di librerie
** ArrayDal C al C++/Array
** Il tipo "bool"Dal C al C++/Utilizzo basilare di librerie/Il tipo "bool"
** L'uso di classi e oggettiDal C al C++/Utilizzo basilare di librerie/L'uso di classi e oggetti
** Dichiarazioni e definizioniDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni
*** Le variabili riferimentoDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#Le variabili riferimento
*** Il modificatore "const"Dal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#Il modificatore "const"
*** Il sovraccaricamentoDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#Il sovraccaricamento
*** L'inizializzazione degli oggettiDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#L'inizializzazione degli oggetti
*** L'allocazione degli oggettiDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#L'allocazione degli oggetti
** L'uso dei templateDal C al C++/Utilizzo basilare di librerie/L'uso dei template
** L'uso dei namespaceDal C al C++/Utilizzo basilare di librerie/L'uso dei namespace
** I file di intestazioneDal C al C++/Utilizzo basilare di librerie/I file di intestazione
** L'uso delle stringheDal C al C++/Utilizzo basilare di librerie/L'uso delle stringhe
** I canali di ingresso/uscitaDal C al C++/Utilizzo basilare di librerie/I canali di ingresso/uscita
** La gestione delle eccezioni
** I contenitori standardDal C al C++/Utilizzo basilare di librerie/I contenitori standard
** Le funzioni standardDal C al C++/Utilizzo basilare di librerie/Le funzioni standard
* Utilizzo avanzato di librerie
** Ridefinizione di funzioni membroDal C al C++/Utilizzo avanzato di librerie/Ridefinizione di funzioni membro
** I parametri di defaultDal C al C++/Utilizzo avanzato di librerie/I parametri di default
** Gli iteratori sui contenitori
** Gli algoritmi sui contenitori
* Creazione di librerie
** Classi isolateDal C al C++/Classi isolate
*** I costruttoriDal C al C++/Classi isolate#I costruttori
*** I distruttoriDal C al C++/Classi isolate#I distruttori
*** Separazione tra interfaccia e implementazioneDal C al C++/Classi isolate#Separazione tra interfaccia e implementazione
** Gerarchie di classiDal C al C++/Gerarchie di classi
** Proprietari di risorse
** Eccezioni
** Namespace
** Template di funzione
** Template di classe
** Algoritmi su sequenze
* La metaprogrammazione
* La progettazione del software
* Gioco life di ConwayDal C al C++/Gioco life di Conway
Modifica il sommario
Un array in C++ è un insieme di elementi omogenei tra loro. I dati vengono raggruppati e organizzati secondo uno schema ben definito prende il nome di struttura dati. L'array è una struttura dati che contiene dati dello stesso tipo e dove gli elementi si distinguono uno dall’altro attraverso un indice.
Un array può essere costruito sia a tempo di compilazione, sia a tempo di esecuzione. Nel primo caso la dimensione dell'array dovrà essere nota durante la compilazione, mentre nel secondo caso la dimensione può essere stabilita in fase di esecuzione del programma.

## Array Monodimensionali

Per costruire un array allocato nello stack si deve operare così:
In questo caso la variabile mioarray ha un raggio d'azione statico e la sua deallocazione in memoria avviene semplicemente quando l'identificatore mioarray va fuori ambito (ad esempio, dopo un ciclo).
Per costruire un array allocato nello heap si deve operare così:
La dimensione n è nota solo a tempo di esecuzione, perciò l'intero array sarà allocato nella zona heap. L'unico modo per dereferenziare l'array è mediante il puntatore mioarray. La deallocazione questa volta non è così banale come al caso precedente, poiché essa deve essere effettuata esplicitamente mediante l'operatore delete in questa maniera:
Bisogna stare molto attenti perché se il puntatore mioarray va fuori ambito, non esisterà più il modo per effettuare la deallocazione dell'array, e se venisse eseguita l'istruzione appena citata, avverrà un crash al programma (segmentation fault).
L'accesso agli elementi dell'array è semplice, e lo si fa attraverso l'operatore estrazione:
Questa sintassi si può usare in tutti e due i casi di allocazione dell'array.

## Array Multidimensionali - Matrici

Creare una matrice non differisce di molto rispetto alla creazione di un array.
Per costruire una matrice quadrata nxn nella memoria stack, si deve operare così:
Per costruire l'analoga matrice quadrata nxn nella memoria heap, si deve operare così:
Per accedere agli elementi di una matrice, basta:
Realizzare una matrice dinamica in questa maniera può essere un po' pericoloso. Anche se stilisticamente la matrice sembra ben creata, in realtà c'è un problema di fondo. Infatti il C++ (come il C) memorizza gli elementi per riga, e quando viene creata una matrice mediante allocazione statica, la matrice occupa nxn posizioni consecutive. Questo vuol dire che è possibile scorrere l'intera matrice mediante un solo ciclo for, usando l'aritmetica dei puntatori se la matrice viene creata staticamente.
miamatrice non è altro che l'indirizzo del primo elemento, cioè miamatrice = &miamatrice[0][0]. Per scorrere gli elementi mediante un solo ciclo for è necessario fare così:
Questo modo di operare funziona con delle matrici allocate nella memoria stack, ma in generale non vale per quelle allocate nella memoria heap.
Per avere un qualcosa di funzionante, si deve per forza ricorrere a dei trucchetti perdendo però un po' di memoria. Il primo passo è la creazione di un array esteso che simuli la matrice: se la matrice è nxn (n righe e n colonne) dovrà essere creato un array monodimensionale di lunghezza nxn. In questo caso l'aritmetica dei puntatori sarà salvaguardata, ma l'accesso alla matrice non sarà agevole, dato che non ci si potrà accedere specificando la riga e colonna semplicemente.
Per eliminare questo inconveniente, si può usare un array di puntatori ausiliario in modo attaccarlo all'array esteso appena creato. Il codice per far questo è: