Vettori in linguaggio C
Cos'è un vettore
Un vettore è una struttura dati composta da valori dello stesso tipo.
A cosa servono i vettori
Permettono di accedere a diversi valori usando il nome di una sola variabile.
Ogni valore (o elemento) è associato a un numero all'interno di un indice anziché una locazione di memoria.
Il primo elemento del vettore è sempre identificato dal numero zero.
La dichiarazione di un vettore in C
Per usare un vettore nel linguaggio C devo prima dichiararlo.
tipo nome [numero elementi]
Nella dichiarazione devo indicare il tipo dei dati, il nome del vettore e il numero degli elementi tra parentesi quadre.
Un esempio pratico
Dichiaro un vettore chiamato "prova" composto da cinque numeri interi
int prova[5]
L'assegnazione dei valori al vettore
Per assegnare i valori al vettore devo indicare nel lato sinistro il nome del vettore e la posizione dell'elemento nell'indice.
nome[posizione] = valore
Al lato destro indico il valore che voglio assegnargli.
Un esempio pratico
Assegno dei valori agli elementi del vettore prova.
prova[0]=27;
prova[1]=21;
prova[2]=30;
prova[3]=23;
prova[4]=25;
Non è comunque necessario indicare un valore a tutti gli elementi. Potrei anche assegnare un valore soltanto ad alcuni elementi.
Ad esempio, potrei dichiarare solo tre elementi
prova[0]=27;
prova[3]=23;
prova[4]=25;
Gli elementi non dichiarati, nelle posizioni 1 e 2, avrebbero uno stato iniziale non definito.
Nota. L'indice deve essere inferiore al numero degli elementi dichiarati nel vettore. Quando si indica una posizione superiore a quella dichiarata, il compilatore va ine errore. Ad esempio, se il vettore prova ha 5 elementi non posso assegnare un valore in posizione prova[10].
In alternativa, posso assegnare i valori del vettore in un'unica riga di codice, indicandoli tra parentesi graffe al momento della dichiarazione
int prova[5] = {27,21,30,23,25}
Questa seconda strada è detta inizializzazione in linea.
In questo caso è necessario indicare i valori secondo l'ordine progressivo dell'indice da 0 in poi.
Anche in questo caso non occorre indicare tutti gli elementi.
L'accesso al vettore
Per accedere al contenuto del vettore indico il nome del vettore e la posizione dell'elemento che mi interessa tra parentesi quadre.
nome[posizione]
Un esempio pratico
Definisco il vettore prova
int prova[5] = {27,21,30,23,25}
Per stampare il terzo elemento scrivo il nome del vettore
printf("il terzo elemento è %d", prova[2])
Tra parentesi quadre indico la posizione dell'elemento nell'indice ossia 2.
Nota. Poiché il primo elemento del vettore occupa la posizione 0 nell'indice, il terzo vettore occupa la posizione 2.
Un esempio pratico
Nella riga 4 di questo programma dichiaro un vettore e lo chiamo "lettere".
E' un vettore di tipo char, quindi può ospitare dei caratteri, ed è definito per 5 elementi.
- #include <stdio.h>
- int main()
- {
- char lettere[5];
- lettere[0]='A';
- lettere[1]='B';
- lettere[2]='C';
- printf("Il terzo elemento è %c \n", lettere[2]);
- printf("Il quinto elemento è %c \n", lettere[4]);
- return 0;
- }
Nelle righe 5-7 assegno dei valori soltanto ad alcuni elementi del vettore. Non assegno alcun valore al quarto e al quinto elemento.
Essendo dei caratteri uso gli apici per inserire i rispettivi valori (es. 'A', 'B', 'C').
Infine, nelle righe 8-9 stampo il contenuto del terzo e del quinto elemento del vettore.
L'output è il seguente
Il terzo elemento è C
Il quinto elemento è
Il programma stampa correttamente il contenuto del terzo elemento (C).
Nel caso del quinto elemento, invece, non stampa nulla perché non gli ho ancora assegnato un valore.
Gli array multidimensionali in C
Il linguaggio C permette anche di usare array multidimensionali.
Al momento della dichiarazione le dimensioni dell'array vanno indicate tra parentesi quadre.
tipo nome [n1] [n2]
Dove n1 e n2 sono il numero di elementi della prima e della seconda dimensione di un array bidimensionale.
Nota. Allo stesso modo, posso creare array multidimensionali a tre o più dimensioni semplicemente aggiungendo altri operatori [ n3 ] [n4] ecc.
Un esempio pratico
Alla riga 3 di questo programma dichiaro un vettore "lotto" a due dimensioni con 10 righe e 5 colonne
- #include <stdio.h>
- int main() {
- int lotto [5][10];
- lotto[2][4]=90;
- printf("il numero è %d ", lotto[2][4]);
- return 0;
- }
Si tratta di un array a due dimensioni che può contenere 50 elementi (10 righe x 5 colonne).
Nella riga 4 del codice sorgente assegno un valore a un elemento dell'array.
Ad esempio, al terzo elemento della quinta riga dell'array.
Nota. Anche in questo caso, come sempre, bisogna ricordarsi che gli indici dell'array cominciano da zero e non da uno. Quindi la terza colonna dell'array è l'operatore [2] mentre la quinta riga dell'array è l'operatore [4].
Infine, alla riga 5 del codice richiamo e stampo il contenuto dell'elemento che ho appena modificato.
Il risultato in output è
il numero è 90
Come passare un array a una funzione
In una chiamata di funzione posso passare l'array come parametro in ingresso della funzione.
Devo solo indicare nella chiamata il nome dell'array senza le parentesi quadre.
nomefunzione(nomearray);
Nella definizione della funzione che riceve l'array, invece, devo indicarlo con le parentesi quadre.
void funzione(tipo nome[]) { ... }
Devo però fare attenzione a un aspetto. Nel linguaggio C il passaggio di un array come parametro di una funzione è un passaggio per riferimento.
Vuol dire che la chiamata passa alla funzione l'indirizzo di memoria dell'array e non i dati.
Pertanto, se la funzione modifica l'array, modifica anche l'array originale.
Un esempio pratico
In questo programma definisco una funzione azzera() e un array prova con tre elementi.
- #include <stdio.h>
- void azzera(int v[], int n) {
- v[n]=0;
- return;
- }
- int main()
- {
- int prova[3];
- prova[0]=2000;
- prova[1]=2001;
- prova[2]=2002;
- printf("Prima l'anno è %d \n", prova[2]);
- azzera(prova, 2);
- printf("Dopo la chiamata l'anno è %d \n", prova[2]);
- return 0;
- }
Nella riga 8 dichiaro l'array prova di 3 elementi.
Nelle righe 9-11 assegno agli elementi del vettore i valori 2000, 2001 e 2002.
Nella riga 12 stampo a video il contenuto dell'elemento prova[2] tramite l'istruzione printf().
Prima l'anno è 2002
Nella riga 13 il programma chiama la funzione azzera() passando come parametro l'array prova[] e un numero intero n=2.
La funzione riceve l'array e cancella l'n-esimo elemento (n=2).
Quando il controllo torna al programma principale (main) il contenuto dell'array è cambiato.
Nella riga 14 il programma stampa di nuovo l'elemento prova[2].
Dopo la chiamata l'anno è 0
Il contenuto dell'array originale è cambiato.
E così via.