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.

un esempio di vettore

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.

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char lettere[5];
  5. lettere[0]='A';
  6. lettere[1]='B';
  7. lettere[2]='C';
  8. printf("Il terzo elemento è %c \n", lettere[2]);
  9. printf("Il quinto elemento è %c \n", lettere[4]);
  10. return 0;
  11. }

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

  1. #include <stdio.h>
  2. int main() {
  3. int lotto [5][10];
  4. lotto[2][4]=90;
  5. printf("il numero è %d ", lotto[2][4]);
  6. return 0;
  7. }

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.

  1. #include <stdio.h>
  2. void azzera(int v[], int n) {
  3. v[n]=0;
  4. return;
  5. }
  6. int main()
  7. {
  8. int prova[3];
  9. prova[0]=2000;
  10. prova[1]=2001;
  11. prova[2]=2002;
  12. printf("Prima l'anno è %d \n", prova[2]);
  13. azzera(prova, 2);
  14. printf("Dopo la chiamata l'anno è %d \n", prova[2]);
  15. return 0;
  16. }

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.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Libri di approfondimento

Il linguaggio C

  1. Un esempio pratico
  2. Come compilare il programma

Impariamo a programmare

  1. Come dichiarare le variabili
  2. Gli operatori
  3. La libreria stdio.h
  4. Come visualizzare in output testo e variabili
  5. Come usare le stringhe
  6. L'istruzione IF
  7. Le strutture cicliche
  8. Le funzioni
  9. Gli array