Sezione 3.1 Array |
||
![]() |
Gli array sono sequenze di variabili dello stesso tipo che vengono situate consecutivamente nella memoria ed alle quali è possibile accedere usando uno stesso nome (identificatore) a cui viene aggiunto un indice.
Questo significa, ad esempio, che possiamo memorizzare 5 valori di tipo int senza bisogno di dichiarare cinque diverse variabili con cinque diversi identificatori. Per fare questo è sufficiente dichiarare un array di cinque elementi dello stesso tipo int con un solo identificatore.
Ad esempio un array di nome billy contenente 5 valori di tipo int si può rappresentare nel seguente modo:
in cui ogni cella rappresenta un elemento dell'array. Gli elementi sono numerati da 0 a 4 in quanto, in un array, l'indice del primo elemento è sempre 0 (e non 1).
Come tutte le variabili anche gli array devono essere dichiarati prima
di poterli usare. Un esempio di dichiarazione di un array in C++ è:
tipo nome [dimensione];dove tipo è il tipo degli elementi ( int, float ...) detto anche tipo base dell'array , nome è un identificatore e dimensione, che deve essere racchiuso tra parentesi quadre [], è la dimensione, ossia il numero di elementi, dell'array.
La dichiarazione dell'array billy è:
int billy [5];
ATTENZIONE: Il campo dimensione deve essere un valore costante in quanto gli array sono blocchi di memoria di dimensione prefissata ed il compilatore deve conoscere esattamente quanta memoria serve per l'array prima che il programma venga eseguito. |
int billy [5] = { 16, 2, 77, 40, 12071 };l'array viene inizializzato come segue:
Il numero di valori usati per l'inizializzazione (quelli posti tra le parentesi grafe {}) deve essere esattamente uguale alla dimensione dell'array. In C++ è possibile anche usare la notazione:
int billy [] = { 16, 2, 77, 40, 12071 };ed in questo caso viene assunto implicitamente come dimensione dell'array il numero di valori della lista di inizializzazione.
name[index]Proseguendo l'esempio dell'array billy di 5 elementi di tipo int, i nomi mediante i quali possiamo accedere a ciascun elemento dell'array sono quelli indicati sopra le singole celle nella figura seguente:
Ad esempio, se vogliamo memorizzare il valore 75 nel terzo elemento di billy possiamo usare l'assegnazione:
billy[2] = 75;oppure, per copiare il valore del terzo elemento nella variabile a possiamo usare:
a = billy[2];Dunque, a tutti gli effetti, billy[2] si comporta come una variabile di tipo int.
Notiamo che il terzo elemento di billy
è billy[2], infatti billy[0]
è il primo, billy[1] è il secondo e di
conseguenza billy[2] è
il terzo. Per la stessa ragione l'ultimo elemento è billy[4]
. Se scriviamo billy[5], noi
accediamo al sesto elemento dell'array che non è previsto
incorrendo molto probabilmente in un errore di esecuzione.
A questo punto occorre notare i due diversi usi delle parentesi quadre [ ] con gli array: nella dichiarazione di un array esse sono usate per indicare la dimensione dell'array mentre in tutti gli altri contesti esse vengono usate per specificare un indice per individuare un particolare elemento dell'array. Ad esempio:
Altre possibili operazioni con gli array sono:int billy[5]; // dichiarazione di un nuovo array di 5 elementi
billy[2] = 75; // accesso ad un elemento particolare dell'array: quello di indice 2.
billy[0] = a;
billy[a] = 75;
b = billy [a+2];
billy[billy[a]] = billy[2] + 5;
// esempio con gli array |
12206 |
jimmy è un array bidimensionale di 3 per 5 valori di tipo int. Esso si può pensare come un array di 5 elementi, ciscuno dei quali è a sua volta un array di 3 elementi (le colonne). Esso si dichiara come segue:
int jimmy [3][5];e, per riferirsi all'elemento nella seconda riga e nella quarta colonna si usa la notazione:
jimmy[1][3]Gli array multidimensionali possono avere più di due indici (due dimensioni). Possono avere quanti indici vogliamo ma è molto raro che servano più di 3 dimensioni. La memoria necessaria per un array multidimensionale può essere eccessiva. Ad esempio:
(ricordiamo che gli indici degli array iniziano sempre con 0).
char secolo [100][365][24][60][60];richiede memoria per un valore char per ogni secondo contenuto in un secolo, più di 3 miliardi di char ! Il che richiede più di 3 gigabytes di memoria RAM.
Gli elementi di un array multidimensionale sono memorizzati nella RAM uno di seguito all'altro come per gli array semplici. Potremmo ottenere lo stesso risultato usando un array semplice di dimensione il prodotto delle dimensioni dell'array multidimensionale:
int jimmy [3][5]; è equivalente acon l'unica differenza che il compilatore gestisce per noi la suddivisione in righe e colonne. Il seguente esempio mostra l'equivalenza delle due soluzioni:
int jimmy [15];
// array multidimensionale |
// array pseudo-multidimensionale |
entrambi i programmi assegnano i seguenti valori al blocco di memoria riservato per jimmy:
Abbiamo usato la definizione di costanti (#define) per facilitare future modifiche al programma nel caso, ad esempio, che decidessimo di allargare l'array aggiungendo una riga. Basta in questo caso cambiare la riga:
#define RIGHE 3con
#define RIGHE 4e non serve nessun'altra modifica del programma.
Per indicare che un argomento di una funzione rappresenta un parametro di tipo array basta scrivere il tipo degli elementi dell'array (il tipo base dell'array) seguito da una coppia di parentesi quadre []. Ad esempio la funzione::
void procedura (int arg[])aspetta un argomento arg di tipo "Array di int ". Per passare alla funzione l'array:
int mioarray [40];è sufficiente scrivere una chiamata della funzione del tipo:
procedura (mioarray);Ecco un esempio completo:
// array come parametri |
5 10 15 2 4 6 8 10 |
Come si vede il primo argomento (int arg[]) ammette qualsiasi array con tipo base int, indipendentemente dalla sua dimensione. Ed è per tale ragione che abbiamo messo anche un secondo argomento: per dire alla funzione quale sia la dimensione dell'array passato come primo argomento. La dimensione dell'array è necessaria perché il ciclo for possa stampare il giusto numero di elementi.
In una dichiarazione di funzione si possono anche mettere array multidimensionali come argomenti. La forma dell'argomento per un array tri-dimensionale è:
tipo_base [][d2][d3]in cui devono essere specificate tutte le dimensioni ad esclusione della prima. Tale argomento ammette un qualsiasi array tridimensionale avente seconda e terza dimensione d2 e d3 prefissate e prima dimensione qualsiasi. Ad esempio:
void procedura (int mioarray[][3][4])La ragione per cui d2 e d3 devono essere fissate è che il compilatore, per determinare la posizione in memoria dell'elemento mioarray[i][j][k] usa la formula i*3*4+j*4+k .
Il passaggio di array (semplici o multidimensionali) come parametri di funzioni è spesso sorgente di errori per i programmatori inesperti. Per una comprensione più precisa di come funzionano gli array occorre conoscere i puntatori (che vedremo al capitolo 3.3, Puntatori )
![]() |
© The C++ Resources Network, 2000-2001 - All rights reserved |
![]() 2-3. Funzioni (II). |
![]() indice |
![]() 3-2. Stringhe di caratteri. |