Programmare in C – Usare i puntatori con gli array

Programmare in linguaggio C. Array e puntatori sono intimamente legati in C. Per utilizzare gli array, bisogna anche sapere come utilizzare i puntatori.

Capire a fondo la relazione fra array e puntatori richiederà probabilmente un po' di tempo e sarà necessario fare un po' di pratica ma ne vale la pena.

Iniziamo quindi un un esempio semplicissimo di array in linguaggio C:

#define MAX 10

int main()
{
    int a[MAX];
    int b[MAX];
    int i;
    for(i=0; i

Quando cerchiamo di compilare questo codice scopriremo che non sarà possibile. Se si vuole copiare il contenuto dell'array a nell'array b bisogna infatti scrivere una cosa di questo tipo:

for (i=0; i

Ma sarebbe meglio utilizzare l'utility memcpy della libreria string.h

Nell'esempio a e b sono variabili array e sia a che b puntano permanentemente al primo elemento, ossia contengono il primo indirizzo di a[0] e b[0] rispettivamente. Poiché sono puntatori permanenti non si può cambiare il loro indirizzo. Ecco spiegato per cui l'istruzione a = b non funziona.

Poiché a e b sono puntatori, si possono fare cose interessanti con puntatori ed array. Per esempio, il seguente codice funziona:

#define MAX 10

void main()
{
    int a[MAX];
    int i;
    int *p;

    p=a;
    for(i=0; i

L'istruzione p = a funziona perchè "a" è un puntatore. Tecnicamente, a punta all'indirizzo del primo elemento dell'array corrente. Questo elemento è un intero, per cui a è un puntatore ad un valore intero. Di conseguenza, dichiarare p come un puntatore ad un intero e impostarlo uguale ad a funziona. Un altro modo di dire esattamente la stessa cosa è scrivere p = &a[0];. Poiché a contiene l'indirizzo di a[0], a e &a[0] significa la stessa cosa.

La seguente figura mostra lo stato delle variabili poco prima dell'inizio dell'esecuzione del ciclo:

Ora "p" sta puntando al primo elemento di "a". La variabile "a" è un puntatore permanente che non può essere cambiato. Ma "p" non è soggetto a questa restrizioni.

Ciò vi incoraggerà ad usare l'aritmetica dei puntatori. Per esempio, se si scrive p++, il compilatore sa che p punta ad un intero, per cui questa istruzione incrementa p dell'appropriato numero di bytes per spostarsi verso l'elemento successivo dell'array. Se p puntasse ad un array di strutture grandi 100 byte, p++ provocherebbe lo spostamento di 100 byte in 100 byte.

Si può copiare il contenuto dell'array a in b utilizzando i puntatori. Il codice che segue sostituisce il codice che abbiamo visto poco sopra:

q=b;
for (i=0; i

Tale codice può essere ancora più abbreviato:

p=a;
q=b;
for (i=0; i

Cosa succederebbe se andassimo oltre la fine dell'array a o b con i puntatori p o q? Il C non si preoccupa del limite, incrementerebbe p e q, copierebbe i contenuti e così via. E' necessario quindi stare molto attenti quando si accede agli array in C. L'ipotesi che il C fa è che il programmatore sa quello che sta facendo!

Si può passare un array ad una funzione in due modi diversi. Cerchiamo di capire come pensando ad una funzione dump che accetta un array di interi come paramento e stampa il contenuto dell'array sullo standard output. Ci sono due modi per codificare questa funzione dump:

void dump(int a[],int nia)
{
    int i;
     for (i=0; i

Oppure

void dump(int *p,int nia)
{
    int i;
     for (i=0; i

La variabile nia (che è leggibile come number_in_array) serve perchè deve essere nota la dimensione dell'array. Da notare che solo un puntatore ad un array, piuttosto che il contenuto di un array, viene passato alla funzione.

Da notare, inoltre, che le funzioni C possono accettare array di dimensione variabile come parametri.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend