# C/Enumerazioni, strutture e unioni/Strutture

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
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

La dichiarazione di una struttura è:
Notate il ; (punto e virgola) finale: è necessario.
Con questo codice, non ho ancora creato alcuna variabile di tipo Studente.

## Esempi d'uso

Dopo una dichiarazione del genere, in qualunque momento può essere dichiarata una variabile in questo modo:
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:
È possibile dichiarare variabili anche al momento della definizione della struttura:
In questo caso, ho definito una struttura Studente e ho anche dichiarato una variabile di tale tipo.

## Puntatori a strutture

È possibile dichiarare anche puntatori a strutture.
L'output sarà:
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ì:
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

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:
Esempio:
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

Una limitazione delle strutture è la seguente: una struttura non può contenere se stessa. Non è possibile insomma avere una cosa del genere:
L'ostacolo può essere però raggirato includendo nella struttura un puntatore allo stesso tipo struttura ed usando gli operatori * o -> per accedere ai membri:
Questa tecnica viene utilizzata per creare diverse strutture dati molto flessibili e utili.

## Pagine correlate

* Linked list
* Alberi
* Grafi