Programmare in C – Puntatori a strutture

E' possibile creare un puntatore a qualsiasi tipo in C, inclusi i tipi definiti dagli utenti.

E' estremamente comune incontrare la necessità di creare puntatori a strutture. Un esempio è illustrato qui di seguito:

typedef struct
{
        char name[21];
        char city[21];
        char state[3];
} Rec;
typedef Rec *RecPointer;

RecPointer r;
r = (RecPointer)malloc(sizeof(Rec));

Il puntatore r è un puntatore ad una struttura. Da notare che r è un puntatore, di conseguenza occupa 4 byte di memoria esattamente come ogni altro puntatore. L'istruzione malloc alloca 45 bytes di memoria nella memoria heap. *r è una struttura come tutte quelle di tipo Rec. Il codice seguente mostra i classici usi della variabile puntatore:

strcpy((*r).name, "Leigh");
strcpy((*r).city, "Raleigh");
strcpy((*r).state, "NC");
printf("%s\n", (*r).city);
free(r);

Si lavora pertanto su *r come una normale struttura, ma bisogna prestare attenzione alla precedenza degli operatori in C. Se si dimentica di mettere le parentesi attorno a r il codice non verrà compilato perchè l'operatore “.” ha una precedenza maggiore rispetto all'operatore “*”.
Poiché diventa noioso editare così tante parentesi quando si lavora con i puntatori a strutture, il C mette a disposizione una sintassi abbreviata che fa esattamente la stessa cosa:
strcpy(r->name, "Leigh");

La notazione tale per cui si usa r-> è esattamente equivalente a (*r).

Puntatori ad Array

E' possibile creare puntatori ad array come mostrato qui sotto.

int *p;
int i;

        p = (int *)malloc(sizeof(int[10]));
        for (i=0; i<10; i++)
                p[i] = 0;
        free(p);
Oppure:

int *p;
        int i;

        p = (int *)malloc(sizeof(int[10]));
        for (i=0; i<10; i++)
                *(p+i) = 0;
        free(p);

Nota che quando si crea un puntatore ad un array di interi si crea semplicemente un puntatore ad un int. La chiamata alla funzione malloc alloca un array di qualsiasi dimensione, e il puntatore punta al primo elemento di un array. Si può accedere ai vari elementi dell'array tramite p e utilizzando il normale accesso agli array. Si può anche utilizzare l'aritmetica dei puntatori, perfettamente equivalente in C.

I puntatori diventano molto comodi quando si lavora su stringhe.

Array di puntatori

A volte si può risparmiare una grande quantità di spazio, oppure si possono risolvere problemi che richiederebbero grandi quantitativi di memoria semplicemente dichiarando un array di puntatori. Nell'esempio di codice sottostante, un array di 10 puntatori a strutture viene dichiarato, invece di dichiarare un array di strutture. Se fosse stato creato un array di strutture, invece, 243*10 = 2430 bytes sarebbe stata la dimensione richiesta dall'array. Utilizzare l'array di puntatori permette all'array di occupare uno spazio minimo finchè i records non vengono effettivamente allocati con l'istruzione malloc. Il codice qui di seguito riportato, alloca semplicemente un record, posizione un valore in esso e rilascia la memoria:

typedef struct
        {
                char s1[81];
                char s2[81];
                char s3[81];
        } Rec;
        Rec *a[10];

        a[0] = (Rec *)malloc(sizeof(Rec));
        strcpy(a[0]->s1, "hello");
        free(a[0]);

Strutture che contengono puntatori
Le strutture possono contenere puntatori, come mostrato qui sottostante

typedef struct
        {
                char name[21];
                char city[21];
                char phone[21];
                char *comment;
        } Addr;
        Addr s;
        char comm[100];

        gets(s.name, 20);
        gets(s.city, 20);
        gets(s.phone, 20);
        gets(comm, 100);
        s.comment =
     (char *)malloc(sizeof(char[strlen(comm)+1]));
        strcpy(s.comment, comm);

La tecnica sopra descritta è utile quando solo alcuni dei record correnti contengono un commento nel campo dei commenti. Se non ci fossero commenti nei record, allora il campo di commento consisterebbe di un solo puntatore (4 bytes). Inoltre, il commento occupa esattamente lo spazio occupato dalla lunghezza della stringa inserita dall'utente.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend