char *a[10]; /* array di 10 elementi di tipo puntatore a char
(ogni elemento e' un puntatore) */
char (*b)[10] /* puntatore ad un array di 10 elementi di tipo char.
*(b+1) punta al successivo array di 10 elementi */
struct s1 /* dichiarazione della struttura s1 */
{
int campo1;
int campo2;
float campo3;
};
struct s1 *p; /* p e' un puntatore alla struttura s1 */
struct s2 /* dichiarazione della struttura s2 */
{
int *campo1;
int *campo2;
float *campo3;
}
struct s2 c; /* c e' una variabile di tipo struct s2 */
Per l'accesso ai campi di una struttura puntata da un puntatore, sarebbe
necessario utilizzare gli operatori *
(dereferencing) e .
(accesso ai campi).
Poiche' l'operatore . ha priorita' maggiore
rispetto all'operatore *, si rende necessario
l'uso di parentesi.
Esempio:
(*p).campo1 = 10; /* assegno il valore 10 all'elemento campo1
della struttura puntata da p */
*c.campo1 = 10; /* assegno il valore 10 all'area di memoria puntata
da campo1.
campo1 e' un puntatore facente parte della struttura
definita da c */
Visto l'uso piuttosto frequente dei puntatori a struttura (1° caso
dell'esempio), la sintassi del C ha messo a disposizione l'operatore
->
...
struct data /* dichiarazione della struttura data */
{
int y; /* anno */
int m; /* mese */
int d; /* giorno */
};
typedef struct data s_data; /* per comodita' */
s_data *pData; /* puntatore a s_data */
/* equivale a:
* struct data *pData;
*/
...
pData = (s_data *)malloc(sizeof(s_data));
if (pData == NULL)
{
/* gestione errore indisponibilita' memoria */
...
}
(*pData).y = 2000; /* inizializzazione anno */
(*pData).m = 7; /* inizializzazione mese */
(*pData).d = 19; /* inizializzazione giorno */
/* oppure */
pData->y = 2000; /* inizializzazione anno */
pData->m = 7; /* inizializzazione mese */
pData->d = 19; /* inizializzazione giorno */
Nell'esempio riportato, il secondo modo di inizializzare i campi della
struttura e' da preferirsi al primo, in quanto risulta essere piu'
leggibile, quindi meno ambiguo e piu' mantenibile del primo metodo.
Indice linguaggio C