Vettori (o Array)

      Nessun commento su Vettori (o Array)

I l linguaggio C supporta delle variabili (chiamate variabili aggregate, vettori, o array) che sono in grado di memorizzare degli insiemi di valori. Esistono due tipi di variabili aggregate nel C: vettori (o array) e le strutture (record o struct).

VETTORI MONODIMENSIONALI (ARRAY AD UNA DIMENSIONE)

Un vettore è una struttura che può contenere dei dati, tutti dello stesso tipo. Questi valori sono chiamati elementi e possono essere individuati da un indice che identifica appunto la loro posizione all’interno del vettore. Gli elementi di un vettore sono disposti per righe (infatti sappiamo che di per sé, il linguaggio C alloca gli elementi in memoria per righe, ma sarebbe possibile anche allocarli per colonne [in entrambi casi è possibile farlo staticamente o dinamicamente. Staticamente il limite per un array è di 1 MB, per un array allocato dinamicamente 2 GB! Ma discuteremo di questo in una sezione successiva]).

Per dichiarare un vettore dobbiamo specificare il tipo e il numero dei suoi elementi. Per esempio, per dichiarare un vettore di nome a, composto da 20 elementi di tipo intero, dobbiamo scrivere:

int a[20];

Se abbiamo in mente di modificare successivamente la dimensione dell’array, o in termini tecnici modificare il SIZE dell’array, conviene definire una macro:

#define N 20

int a[N];

Per accedere a un particolare elemento di un vettore dobbiamo scrivere il nome del vettore seguito da un valore intero racchiuso fra parentesi quadre. Questa operazione prende il nome di subscripting o indicizzazione dell’array. Cosa fondamentale da sapere, è che gli elementi di un vettore hanno indirizzo che parte da 0 e arriva a n-1. Un vettore di 20 elementi come dichiarato sopra avrà elementi con indirizzo da: a[0] fino a a[19].

Pensate i cicli for e gli array come un’unica cosa! I FOR sono indispensabili per effettuare la maggior parte delle operazioni sugli array! Ad esempio:

for (i=0; i<N; i++)

scanf(“%d”,&a[i]);     /*Legge dei dati da tastiera e li inserisce nell’array */

for (i=0; i<N; i++)

sum+=a[i];             /*somma tutti gli elementi del vettore */

for (i=0; i<N; i++)

a[i]=0;     /*azzera tutti gli elementi del vettore */

E questi sono solo alcuni dei tantissimi usi dei for con gli array.

E’ possibile inizializzare un vettore con un ciclo for, oppure inizializzandolo “a mano” al momento della dichiarazione. Ad esempio:

int a[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

Possiamo anche non inserire tutti gli elementi ne vettore, come:

int a[20]={1,2,3,4,5,6,7,8,9,10};

Le restanti locazioni di memoria non inizializzate verrano impostate a zero, ma ciò sarebbe uno spreco, sebbene minimo, di memoria.

E’ anche possibile omettere il size dell’array se dobbiamo inizializzarlo noi a mano. Infatti sarà il compilatore a determinare il size automaticamente. Ad esempio:

int a [ ]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

VETTORI MULTIDIMENSIONALI (ARRAY A DUE O PIU’ DIMENSIONI)

Un vettore può avere un numero qualsiasi di dimensioni. Per esempio possiamo creare un vettore a due dimensioni, matematicamente parlando, una matrice.

int a[5][9];

Questo vettore ha 5 righe e 9 colonne. Sia le righe che le colonne vengono sempre indicizzate a zero. Per accedere ad un elemento della matrice a che si trova alla riga i e alla colonna j, dobbiamo scrivere a[i][j]. Dunque l’elemento che si trova all’i-esima riga e alla j-esima colonna. Il C fornisce un modo molto più flessibile per gestire gli array multidimensionali, ovvero, i vettori di puntatori che tratteremo in seguito.

Le operazioni sui vettori multidimensionali sono eseguite sempre mediante cicli for, questa volta innestati (annidati). Ad esempio per azzerare un vettore multimensionale faremo così:

for (i=0; i<5; i++)

{

for (j=0; j<9; j++)

{

a[i][j]=0;

}

}

Il primo ciclo for (quello più esterno) effettua una “scansione” delle righe, mentre quello più interno “scansiona” le colonne.