• Non ci sono risultati.

Un array, come si è già visto, è un aggregazione di dati omogenei per tipo. Per dichiarare una variabile di tipo array bisogna specificare il tipo T ed il numero n (detto dimensione dell'array) degli elementi che ne fanno parte.

La sintassi in C++ per dichiarare una singola variabile di tipo array è tipo identificatore “[“ costante_intera_senza_segno “]”

Ad esempio

int a[10];

dichiara una variabile a di tipo array avente 10 elementi di tipo int.

La dimensione di un array deve essere una costante (anche con nome), perché deve essere nota a tempo di compilazione.

Negli ultimi standard di C e C++ è consentito dichiarare array la cui dimensione è specificata da una variabile (o in generale da un'espressione). Ovviamente si prende in considerazione il valore che assume la variabile o l'espressione durante l'esecuzione del programma nel momento in cui l'array viene allocato in memoria.

Ad esempio è possibile scrivere

int n;

cout << “inserisci il numero di elementi “; cin >> n;

ma non è assolutamente possibile scrivere

int n,a[n];

cout << “inserisci il numero di elementi “; cin >> n;

in cui n assume un valore dopo che è già stato definito l'array, il quale avrà una dimensione imprevedibile.

Si tratta comunque di una caratteristica che non è supportata da tutti i compilatori e che per il momento sconsigliamo di utilizzare, tra l'altro tale proprietà è garantita in maniera pienamente standardizzata anche dagli array dinamici (capitolo 13).

La dimensione di un array è comunque fissa: una volta che l'array è stato dichiarato non è più possibile aumentare o diminuire il numero di elementi. Il motivo è che l'array per poter funzionare correttamente deve essere memorizzato in una zona consecutiva di memoria. Per aumentare la dimensione di un array sarebbe necessario che la zona di memoria successiva a quella occupata dall'array fosse libera, ma questa è solitamente occupata da altre variabili.

Le variabili array si possono inizializzare con la sintassi

tipo identificatore “[“ costante_intera_senza_segno “]” “=” “{“ costante { “,” costante } “}” Ad esempio

int v[5]={4,5,7,9,-1};

Ogni elemento di un array è identificato con un numero intero, chiamato indice, compreso tra 0 e n- 1. Ad esempio per v abbiamo

indice 0 1 2 3 4

elemento 4 5 7 9 -1

Il tipo di dato array ha come dominio l'insieme di tutte le n-uple di elementi di T. Matematicamente questo insieme si scrive come Tn.

L'unica operazione supportata dal C++ per gli array è la selezione. Non è possibile svolgere direttamente nel linguaggio qualsiasi altra operazione, quali assegnamento, confronto, lettura da tastiera, scrittura sullo schermo, ecc. Tutte queste operazioni devono essere implementate dal programmatore, come vedremo nella sezione successiva.

La mancanza di operazioni di qualsiasi tipo ha anche come effetto che gli array possono essere trattati esclusivamente tramite variabili: non esiste nemmeno la possibilità di avere array costanti anonimi, come invece esiste per i tipi elementari (ad esempio la costante 5 di tipo int).

La selezione di un elemento di un array avviene mediante l'operazione di indicizzazione, la quale ha come operandi l'array e un'espressione intera. La sua sintassi è

nome_array “[“ espressione_intera “]”

Se l'array V ha dimensione n ed e è un'espressione intera, il cui valore è il numero intero i, l'indicizzazione V[e] è valida se i è compreso tra 0 e n-1 e il suo risultato è un riferimento all'elemento i-esimo del vettore V, cioè consente di accedervi sia in lettura che in scrittura.

L'indicizzazione può essere usata per accedere in lettura a tale elemento e in tal caso deve comparire in un'espressione, in cui si usa il valore dell'elemento. Ad esempio

cout << v[3]

scriverà 9 sullo schermo.

L'accesso può anche essere in scrittura. In tal caso l'indicizzazione deve comparire come l-value di un assegnamento (o in contesti assimilabili).

Ad esempio dopo l'istruzione

v[2]=8;

v diventerà

indice 0 1 2 3 4

elemento 4 5 8 9 -1

Il controllo che l'espressione e dell'indicizzazione V[e] abbia un valore compreso tra 0 e n-1 non viene in genere svolto in C++, lasciandolo come eventuale compito al programmatore, il quale di solito lo assolve cercando a priori di far sì che l'indice sia compreso nell'intervallo giusto.

L'operazione di indicizzazione è molto veloce (dello stesso ordine di grandezza del tempo di accesso ad una variabile tradizionale) e soprattutto indipendente dal valore dell'indice: accedere al primo, all'ultimo o a qualsiasi elemento di un array richiede sempre lo stesso tempo. Questo è possibile perché si può calcolare con una semplice formula matematica l'indirizzo in memoria di un qualsiasi elemento di un array. Infatti se V è un array di tipo T e se i dati di T occupano s byte l'uno, l'indirizzo dell'i-esimo elemento di V è

a+s i,

ove a è l'indirizzo di inizio dell'array (indirizzo del primo elemento). Gli array, in conclusione, si possono utilizzare in varie situazioni.

Un primo caso è dato dagli array la cui dimensione è fissa ed esplicita. Ad esempio per memorizzare la superficie di ogni regione italiana occorre usare un array del tipo

double superficie[20];

in cui si associa un indice ad ogni regione. Una possibilità è per ordine da nord a sud: 0=Valle d'Aosta, 1=Piemonte, …, 18=Sicilia, 19=Sardegna

superficie[18]=25708;

In altre situazioni non esiste una dimensione nota a priori. La gestione di una collezione di elementi, il cui numero può variare nel tempo, può essere svolta mediante un array a patto di usare come dimensione dell'array il massimo numero di elementi che saranno presenti nella collezione. Tale dimensione va intesa come dimensione fisica o capacità dell'array ed è fissa. Il numero di elementi presenti è invece da intendersi come dimensione logica dell'array e potendo cambiare nel tempo deve essere memorizzato in una variabile. Ovviamente l'array non cambia realmente di dimensione e tutti gli elementi inutilizzati sono comunque in memoria.

Ad esempio per gestire i soci di un'associazione è possibile immaginare due operazioni: l'iscrizione di un nuovo socio, che inserisce il nominativo del socio nell'array e aumenta la variabile num_soci, e l'uscita di un socio dall'associazione, che elimina il socio dall'array e diminuisce num_soci.

Documenti correlati