Vettori (informatica)

Article on other languages:

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

Un array[1] o vettore è una struttura dati complessa usata in molti linguaggi di programmazione e chiaramente ispirata alla nozione matematica di vettore. Più precisamente, l'array è in genere classificato come un costruttore di tipo: in altre parole, esso consente di definire nuovi tipi di dati a partire da (come aggregati di valori di) tipi preesistenti.

Si può immaginare un array come una sorta di casellario, le cui caselle sono dette celle dell'array stesso. Ciascuna delle celle si comporta come una variabile tradizionale; tutte le celle sono variabili di uno stesso tipo preesistente, detto tipo base dell'array. Si parlerà perciò di tipi come "array di interi", "array di stringhe", "array di caratteri" e così via. In alcuni linguaggi, la dimensione dell'array (ovvero il numero celle di cui esso è composto) viene considerato parte della definizione del tipo array; in tal caso, si parlerà più precisamente di tipi come "array di 100 caratteri" o "array di 10 interi".

Ciascuna delle celle dell'array è identificata da un valore di indice. L'indice è generalmente numerico e i valori che gli indici possono assumere sono numeri interi contigui che partono da 0 o da 1. Si potrà quindi parlare della cella di indice 0, di indice 1, e, in generale, di indice N, dove N è un intero compreso fra 0 (o 1) e il valore massimo per gli indici dell'array.

Ecco un esempio, che si serve della sintassi C (simile, comunque, a quella di molti altri linguaggi) per definire e valorizzare un array:

int vettore[10]; // definisce "vettore" come array di 10 elementi interi
vettore[0] = 0; // assegna il valore "0" alla cella di indice 0
vettore[1] = 1;
vettore[2] = 1;
vettore[3] = 2;
vettore[4] = 3;

(Il vettore sopra indicato contiene i primi cinque numeri di Fibonacci).

Alcuni linguaggi ammettono indici di tipo non numerico, per esempio stringhe. Si parla in questo caso di hash table, o di array associativo, perché ogni valore stringa utilizzato come indice viene associato a un valore dell'array. Vediamo un esempio in linguaggio PHP:

$persona["nome"] = "Mario";
$persona["cognome"] = "Rossi";
$persona["eta"] = 32;

Come si vede, l'esempio è molto simile al precedente; l'unica differenza rilevante (se si esclude una piccola differenza puramente sintattica tra i linguaggi) è che l'indice dell'array è di tipo stringa. Inoltre, il lettore esperto potrà osservare che in PHP non esiste il vincolo di un "tipo base" fissato per tutte le celle dell'array: alle prima due è stata assegnata una stringa, alla terza un numero intero.

È infine da segnalare che un array (sia esso associativo o meno) può avere più di una dimensione. Nel caso un array abbia più dimensioni (specialmente nel caso bidimensionale), esso viene spesso definito "matrice". La differenza è che una matrice ha due (o più) indici (ogni indice è una dimensione) e ogni elemento è identificato dalla combinazione di valori di tutti gli indici del vettore. Ecco un esempio:

$persona[0]["nome"] = "Mario";
$persona[0]["cognome"] = "Rossi";
$persona[1]["nome"] = "Giorgio";
$persona[1]["cognome"] = "Bianchi";

In questo caso ogni valore corrisponde a una caratteristica di una certa persona. Il primo indice, in questo caso numerico, identifica una persona. Il secondo indice, in questo caso una stringa, indica la caratteristica in questione. Di conseguenza per accedere a un elemento non è sufficiente il primo indice, perché non indica quale caratteristica ci serve; ma nemmeno il secondo, perché non indica a quale persona ci stiamo riferendo. È dunque la combinazione di entrambi gli indici a identificare un valore.

Un array a due dimensioni è visualizzabile come una tabella, in cui la prima colonna contiene i valori di un indice, la prima riga i valori di un altro indice e le singole celle i vari elementi. Per gli stessi principi, se ha tre dimensioni è visualizzabile come un cubo. Una matrice potrebbe contenere anche più di tre indici, ma ciò avviene solo in casi molto particolari, per esempio in applicazioni scientifiche o di datawarehousing.

Indice

Array e strutture di controllo

La maggior parte dei programmi che utilizzano array si servono della struttura di controllo "cicli for" per attraversare gli array, ovvero per accedere sequenzialmente alle celle. Il ciclo for si presta molto naturalmente all'uso combinato dell'array proprio perché consente di specificare un tipo particolare di iterazione di un certo insieme di istruzioni, controllato da un indice che assume un insieme di valori solitamente interi e contigui. Per esempio, il codice Java per stampare i contenuti di un array di 100 interi potrebbe essere come segue:

for(int i=0; i<100; i=i+1) // per i crescente con passo 1 da 0 a 99
 System.out.println(vettore[i]); // stampa la i-esima cella

Aspetti implementativi

Gli array, specialmente nel caso di indici numerici contigui, sono generalmente allocati in aree contigue della memoria del computer. Nel caso in cui il tipo base sia fissato come in linguaggio C, C++ e Java , per esempio esso occuperà un'area di memoria le cui dimensioni complessive sono date dalla dimensione del tipo base moltiplicata per il numero totale di celle. Il reperimento di un elemento su base indice avviene sommando all'indirizzo di memoria di partenza dell'array (noto al compilatore o all'interprete informatica) il valore dell'indice moltiplicato per la dimensione del tipo base. Così, se un array di interi Java (a 4 byte) viene allocato all'indirizzo 1000 della memoria, il suo quinto elemento sarà allocato alla posizione 1000+(4*5)=1020. Questa regola permette al linguaggio un accesso molto efficiente agli elementi del vettore attraverso meccanismi di indirizzamento indiretto, quali sono forniti da tutti i processore|processori e quindi da tutti i linguaggi macchina. In quest'ottica, il comportamento degli array è spesso riconducibile a quello dei puntatori.

Alcuni linguaggi, soprattutto fra quelli compilati, non mantengono in memoria nessun tipo di informazione sulla dimensione di un array, e non sono quindi in grado di eseguire controlli sulla correttezza degli indici utilizzati per accedere a una determinata cella. Se per esempio un array linguaggio C di 20 elementi di dimensione 2 byte è allocato all'indirizzo 1000, l'ultima cella valida ha indice 19 e indirizzo 1040; ma se il programmatore, per errore, tenta di accedere alla quarantesima cella (che non esiste), il linguaggio non rileverà l'errore e fornirà accesso alla locazione di memoria 1080. Questo tipo di errori nell'indicizzazione degli array sono, insieme agli errori sui puntatori, fra le più frequenti cause di malfunzionamento di programmi C e C++. Altri linguaggi (per esempio Java) mantengono in memoria informazioni sulle dimensioni reali degli array e sono quindi in grado di segnalare questo genere di errori senza fornire accesso alla cella erroneamente indirizzata.

Note

  1. ^ Per una discussione sull'ipotetica traduzione italiana del vocabolo array, con cenni alla sua etimologia, si veda — in nota — la voce Wullenweber.

Voci correlate

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net