Linguaggio C per MSX
Rubrica a cura di Nicola Brogelli (Parte 6)
Array e Puntatori
Array Multidimensionali
Fino ad ora abbiamo considerato array monodimensionali, i quali richiedevano un solo indice per l’individuazione di un elemento. Il C permette di definire anche array multidimensionali, in questo caso sono necessari almeno due indici per identificare un elemento desiderato.
type identifier [constant-expressio] [constant-expressio] ……
Anche se un array multidimensionale viene memorizzato come una sequenza di elementi, questo può essere manipolato come un array di array. Quindi per accedere ad un elemento di un array multidimensionale abbiamo bisogno di specificare tanti indici quante sono le dimensioni.
Nell’esempio successivo abbiamo la dichiarazione dell’array multidimensionale numero di tipo intero.
int numeri[3][4] = {{10,0,12,-1}, {7,-3, 2, 5}, {-5,-2, 2, 9}};Esistono diversi metodi per accedere ad un array multidimensionale, quello mediante gli indici è sicuramente quello più semplice e lo possiamo vedere nell’esempio sottostante alla riga 1.
int a = numeri[1][2];
int b = *(numeri[1]+2);
int c = *(*(numeri+1)+2);
// in tutti e tre i casi il risultato dell’assegnazione è il valore 2È comunque possibile accedere all’array multidimensionale tramite puntatori, la sintassi è sicuramente più complessa e può essere espressa come nell’esempio alle righe 2 e 3.
Ricordiamo che un array a due indici come quello dell’esempio ( numeri[3][4] ), occupa in memoria 3 × 4 posizioni “contigue” e quindi, per certi versi, si potrebbe considerare come un array unidimensionale di lunghezza 12. Ricordo che l’ordine di memorizzazione degli elementi dell’array segue la regola per cui l’indice più a sinistra cresce più lentamente. Quindi in memoria dopo l’elemento numeri[0][0] abbiamo numeri[0][1], poi numeri[0][2] e così via.
Possiamo pensare all’array numeri[3][4] come a un array di 3 elementi, in cui ciascun elemento punta a un array di 4 elementi. Se adottiamo questo punto di vista appare chiaro che il nome numeri oppure numeri[0] è un puntatore al primo elemento dell’array bidimensionale, cioè al primo sotto-array di lunghezza 4; quindi numeri + 1 o numeri[1] punta al secondo sotto-array di lunghezza 4 e così via.

L’espressione *(numeri + 1) è uguale al contenuto della locazione di memoria a cui punta numeri + 1; questa locazione contiene l’indirizzo del secondo sotto-array, quindi *(numeri + 1) non è un elemento dell’array ma è ancora un puntatore. Per essere più chiaro contiene l’indirizzo dell’sotto -array che contiene i valori {7,-3, 2, 5} . E nello stesso modo è ancora un puntatore l’espressione *(numeri + 1) + 2, che è l’indirizzo del terzo elemento del secondo sotto-array.
E infine l’espressione *(*(numeri + 1)) deferenzia il puntatore *(numeri + 1) restituendo il contenuto della locazione di memoria puntata: tale contenuto corrisponde al primo elemento del secondo sotto-array, che, in termini di indici, possiamo scrivere numeri[1][0], e nello stesso modo l’espressione *(*(numeri + 1) + 3) è uguale ad numeri[1][3].
Spero che la dispensa sia sufficientemente chiara, nel seguito torneremo a parlare di array come parametro di funzioni.
Per chi fosse interessato l’Associazione MSX Italia ha creato un gruppo di lavoro di Ricerca e sviluppo sulla programmazione C per MSX. Per maggiori info: associazioneMSXitalia@gmail.com




0 commenti