C/Enumerazioni, strutture e unioni/Strutture

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
CopertinaC/Copertina
IndiceC/Indice

Una struttura è un insieme di una o più variabili. Le variabili possono essere di qualunque tipo e vengono raggruppate sotto un unico nome. Questo raggruppamento viene effettuato quando occorrono più variabili che hanno qualcosa in comune, un esempio pratico può essere quello di uno studente universitario. Lo studente ha tre caratteristiche principali (membri): Nome, Cognome, Matricola. Sarebbe utile raggrupparle insieme, le strutture permettono appunto questo raggruppamento.

È possibile considerare la struttura come un vero e proprio tipo di dati creato dall'utente, un po' come le enumerazioni.

Sintassi[modifica]

La dichiarazione di una struttura è:

struct Studente {
  char nome[25];
  char cognome[25];
  int matricola;
};

Notate il ; (punto e virgola) finale: è necessario.

Con questo codice, non ho ancora creato alcuna variabile di tipo Studente.

Esempi d'uso[modifica]

Dopo una dichiarazione del genere, in qualunque momento può essere dichiarata una variabile in questo modo:

struct Studente var1;

Adesso var1 è una struttura con tre membri: nome e cognome, stringhe di 25 caratteri, e matricola, la matricola dello studente.

Per modificare o leggere i membri si usa l'operatore . (punto) in questo modo:

scanf("%s", var1.nome);
scanf("%s", var1.cognome);
var1.matricola = 12345;
altra_matricola = var1.matricola; /* altra_matricola è uguale a 12345 */

È possibile dichiarare variabili anche al momento della definizione della struttura:

struct Studente {
  char nome[25];
  char cognome[25];
  int matricola;
} pippo;

In questo caso, ho definito una struttura Studente e ho anche dichiarato una variabile di tale tipo.

Puntatori a strutture[modifica]

È possibile dichiarare anche puntatori a strutture.

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 int main(void)
 {
 	struct Studente {
 		char nome[25];
 		char cognome[25];
 		int matricola;
 	} pippo, *punt;
 	punt = &pippo;
 	strcpy(punt->nome, "Massimiliano");
 	printf("Il nome dello studente è: %s", pippo.nome);
 	return 0;
 }

L'output sarà:

Il nome dello studente è: Massimiliano

Il puntatore punt punta alla variabile pippo; per accedere dal puntatore ad un membro della struttura da esso puntata si usa l'operatore -> (freccia).

Il programma avrebbe funzionato anche così:

 strcpy((*punt).nome, "Massimiliano");

Ma l'operatore freccia è più comodo da usare.

La funzione strcpy, appartenente alla libreria C standard, permette di copiare la stringa rappresentata dal secondo argomento nella stringa rappresentata dal primo argomento.

Campi bit[modifica]

In C, con i campi bit, è possibile accedere ai singoli bit dei dati. I campi bit sono utili in molte occasioni, tipo quando si vogliono rappresentare una serie di variabili booleane.

Sintassi:

 struct lamiastruttura
 {
  tipo membro1 : numerodibit;
  tipo membro2 : numerodibit;
  ...
  tipo membroN : numerodibit;
 } ilmiocampobit;

Esempio:

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
 	struct animale {
 		unsigned mammifero : 1;
 		unsigned oviparo : 1;
 	} ornitorinco, balena;
 	ornitorinco.mammifero = 1;
 	ornitorinco.oviparo = 1;
 	balena.mammifero = 1;
 	balena.oviparo = 0;
 	return 0;
 }

In questo caso, si sono usati solo 2 bit per memorizzare i valori mammifero e oviparo. Si nota come i campi bit siano utili per dichiarare variabili booleane (vero/falso) in una struttura. Si possono usare, in una stessa struttura, membri normali e campi bit.

Altri utilizzi[modifica]

Una limitazione delle strutture è la seguente: una struttura non può contenere se stessa. Non è possibile insomma avere una cosa del genere:

struct Elemento {
  int Campo1;
  struct Elemento Campo2;
};

L'ostacolo può essere però raggirato includendo nella struttura un puntatore allo stesso tipo struttura ed usando gli operatori * o -> per accedere ai membri:

struct Elemento {
  int Campo1;
  struct Elemento *Campo2;
};

Questa tecnica viene utilizzata per creare diverse strutture dati molto flessibili e utili.

Pagine correlate[modifica]