lug 03 2009

Array Multidimensionali in C

Categoria: Programmazione Csaverio @ 17:50

Questo articolo tratta la gestione delle stringhe e, in generale, dei vettori multidimensionali nel linguaggio C.

Allocazione di memoria del vettore

Sappiamo che nel linguaggio c dichiariamo un vettore con l’istruzione

int vett[n];

in questo modo creiamo un vettore chiamato vett di n elementi:

vett[0] , vett[1] , … , vett[n-1]

Supponiamo, con n=5, di riempire il vettore in questo modo:

10 11 12 13 14

Risulterà che:

0
1
2
3
4
 vett[0] = 10 = *vett
 vett[1] = 11 = *vett+1
 vett[2] = 12 = *vett+2
 vett[3] = 13 = *vett+3
 vett[4] = 14 = *vett+4

Inoltre supponiamo di aver fatto girare al computer il programma,
avremo alcuni indirizzi se stampiamo:

804400008 = vett
804400012 = vett+1
804400016 = vett+2
804400020 = vett+3
804400024 = vett+4

Passare il vettore ad una funzione

Ora che sappiamo come viene creato un vettore in memoria affrontiamo
il problema di passare il vettore nelle funzioni. Supponiamo la funzione:

0
1
2
3
4
5
6
void funzione(int *vettore)
 {
 int i;
 
for (i=0 ; i<n ; i++)
 vettore[i] += 20;
 }

che aggiunge 20 ad ogni elemento del vettore. Quale sarà la chiamata giusta
da fare nel programma chiamante?

0
1
2
3
4
5
6
7
8
9
main()
 {
 .
 .
 .
 funzione(vett);
 .
 .
 .
 }

Perchè passiamo “vett” e non “&vett”?
Il contenuto di “vett” non è altro che un indirizzo… il primo elemento del
vettore è “*vett” oppure “vett[0]“.
Quindi con questa chiamata non facciamo altro che passare per valore alla
funzione un indirizzo che è proprio l’indirizzo del nostro vettore :)

Praticamente nella funzione viene dichiarato un puntatore ad intero chiamato
“vettore”. La dichiarazione è

0
int *vettore

Quindi in vettore mettiamo l’indirizzo che nell’esempio è 804400008.
All’intrno della funzione risulterà che:

vettore   = 804400008          <– indirizzo
*vettore   = 10                 <– contenuto di vett[0]
*vettore+1 = 11                 <– contenuto di vett[1]

Questo è il motivo che nel linguaggio C non è obbligatorio definire la
dimensione del vettore!

STAMPA SU VIDEO DI UN VETTORE v DI n ELEMENTI

0
1
2
3
4
5
6
7
8
9
void StampaVettore(int n, float *v)
 {
 int i;
 
printf("\n Vettore = ( ");
 for ( i=0 ; i<n-1 ; i++ )
 printf("%.2f %s",v[i],", ");
 
printf("%.2f %s \n",v[n-1]," );");
 }

STAMPA SU VIDEO DI UNA MATRICE M DI n RIGHE ED m COLONNE

0
1
2
3
4
5
6
7
8
9
10
void StampaMatrice(int n, int m, float **M)
 {
 int i,j;
 
for (i=0;i<n;i++)
 {
 printf("\n");
 for (j=0;j<m;j++) printf("%.2f %s",M[i][j],"   ");
 }
 printf("\n");
 }

Tags: , ,

Scrivi un commento