Una volta presa dimestichezza con le principali caratteristiche del C si possono utilizzare dei tipi di Dati strutturati. Iniziamo ad esaminare in dettaglio le strutture e unioni.
Struct
Le strutture del C sostanzialmente permettono l'aggregazione di più variabili, in modo simile a quella degli array, ma a differenza di questi non ordinata e non omogenea (una struttura può contenere variabili di tipo diverso). Per denotare una struttura si usa la parola chiave struct seguita dal nome identificativo della struttura, che è opzionale. Nell'esempio sottostante si definisce una struttura libro
e si crea un'istanza di essa chiamata biblio
:
// dichiarazione della struct struct libro { char titolo[100]; char autore[50]; int anno_pubblicazione; float prezzo; }; //dichiarazione dell'istanza biblio struct libro biblio;
La variabile biblio
può essere dichiarata anche mettendo il nome stesso dopo la parentesi graffa:
// dichiarazione della struct e della variabile biblio
struct libro
{
char titolo[100];
char autore[50];
int anno_pubblicazione;
float prezzo;
} biblio;
È anche possibile inizializzare i valori alla dichiarazione, mettendo i valori (giusti nel tipo) compresi tra parentesi graffe:
struct libro biblio = {"Guida al C", "Fabrizio Ciacchi", 2003, 45.2};
Per accedere alle variabili interne della struttura si usa l'operatore punto '.
'. Una variabile interna può essere poi manipolata come qualsiasi altra variabile:
// assegna un valore al prezzo del libro biblio.prezzo = 67.32; // assegna ad una variabile int l'anno di pubblicazione del libro int anno = biblio.anno_pubblicazione; // stampa il titolo del libro printf ("%s n", biblio.titolo);
Creare nuovi tipi di dato con typedef
Per definire nuovi tipi di dato viene utilizzata la funzione typedef. L'uso di typedef
, combinato con struct
ci permette di creare tipi di dato molto complessi, come mostrato nell'esempio seguente:
typedef struct libro { char titolo[100]; char autore[50]; int anno_pubblicazione; float prezzo; } t_libro; t_libro guida = {"Guida al C", "Fabrizio Ciacchi", 2003, 45.2};
In questo modo abbiamo definito un nuovo tipo di nome t_libro
, che non è altro che una struttura; guida
è la variabile creata di tipo t_libro
. Ora possiamo utilizzare il nuovo tipo come ogni altro, ad esempio possiamo creare un array di elementi di tipo t_libro
.
t_libro raccolta[5000];
Per accedere agli elementi dell'array, o per inizializzare i valori, è sufficiente utilizzare l'indice per identificare l'elemento dell'array ed il punto (.
) per accedere alle variabili interne del tipo t_libro
.
// assegna un valore al prezzo del 341mo libro raccolta[340].prezzo = 67.32; // assegna ad una variabile int l'anno di pubblicazione del 659mo libro int anno = raccolta[658].anno_pubblicazione; // stampa il titolo del 23mo libro printf ("%s n", raccolta[22].titolo);
Union
Il tipo di dato union serve per memorizzare (in istanti diversi) oggetti di differenti dimensioni e tipo, con, in comune, il ruolo all'interno del programma. Si alloca la memoria per la più grande delle variabili, visto che esse non possono mai essere utilizzate contemporaneamente (la scelta di una esclude automaticamente le altre), condividendo il medesimo spazio di memoria. In C una unione viene definita tramite la parola chiave union, come mostrato di seguito:
union numero { short numero_piccolo; long numero_lungo; double numero_grande; } numeri;
La definizione di un'unione è molto simile a quella di una struttura, ed è medesimo il modo di accedervi. Inoltre, usata in combinazione con una struttura, si possono ottenere gradevoli effetti in cui viene selezionato automaticamente il tipo giusto della union
:
typedef struct { int max_passeggeri; } jet; typedef struct { int max_altezza; } elicottero; typedef struct { int max_carico; } aereocargo; typedef union { jet un_jet; elicottero un_elicottero; aereocargo un_aereocargo; } velivolo; typedef struct { tipo_velivolo tipo; int velocita; velivolo descrizione; } un_velivolo;
In questo esempio viene definita un'unione di nome velivolo
che può essere un jet
, un elicottero
o un aereocargo
. Nella struttura un_velivolo
c'è un oggetto che identifica il tipo e che permette di selezionare la struttura giusta al momento giusto.