Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 25 di 47
  • livello principiante
Indice lezioni

Struct, typedef e union: utilizzo dei dati strutturati in C

Creare tipi di dati strutturati con typedef in combinazione con struct e union.
Creare tipi di dati strutturati con typedef in combinazione con struct e union.
Link copiato negli appunti

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.

Ti consigliamo anche