TextFile
struct Le struct sono uno degli strumenti più importanti del linguaggio C. Consentono di creare nuovi tipi di dato personalizzati, organizzare meglio le informazioni e rendere il codice più leggibile, modulare e facile da mantenere.
home page
 

Le strutture (struct) nel linguaggio C

Pubblicato il: 30-6-2026

Ultima Modifica: 30-6-2026

📦 Le strutture (struct) nel linguaggio C

Introduzione

Quando si programma in C capita spesso di dover gestire informazioni appartenenti allo stesso oggetto.

Pensiamo ad esempio ai dati di uno studente:

  • Nome

  • Cognome

  • Età

  • Matricola

  • Media voti

Utilizzare una variabile separata per ogni informazione funziona, ma rende il codice difficile da gestire.

Per risolvere questo problema il linguaggio C mette a disposizione le strutture, chiamate struct, che permettono di raggruppare variabili di tipo diverso sotto un unico nome.

Le strutture rappresentano uno degli strumenti fondamentali della programmazione e costituiscono la base di moltissime applicazioni, database, videogiochi, software gestionali e sistemi operativi.


📚 Che cos'è una struttura?

Una struttura è un tipo di dato definito dal programmatore che contiene al suo interno più variabili.

Ogni variabile prende il nome di campo (field o membro).

Ad esempio una persona può essere rappresentata così:

  • nome

  • cognome

  • età

  • altezza

Tutti questi dati appartengono alla stessa persona.


🛠 Sintassi di una struttura

La sintassi generale è:

struct NomeStruttura
{
    tipo campo1;
    tipo campo2;
    tipo campo3;
};

Ad esempio:

struct Persona
{
    char nome[30];
    char cognome[30];
    int eta;
    float altezza;
};

In questo caso abbiamo creato un nuovo tipo chiamato Persona.


📌 Dichiarare una variabile struttura

Una volta definita la struttura possiamo creare delle variabili.

struct Persona mario;

Ora la variabile mario contiene:

  • nome

  • cognome

  • età

  • altezza

Tutti insieme.


✍ Accedere ai campi

Per accedere ai campi si utilizza l'operatore punto (.)

mario.eta = 35;

oppure

strcpy(mario.nome, "Mario");
strcpy(mario.cognome, "Rossi");
mario.altezza = 1.80;

💻 Programma completo

#include <stdio.h>
#include <string.h>

struct Persona
{
    char nome[30];
    char cognome[30];
    int eta;
    float altezza;
};

int main()
{
    struct Persona p;

    strcpy(p.nome, "Marco");
    strcpy(p.cognome, "Bianchi");

    p.eta = 28;
    p.altezza = 1.75;

    printf("Nome: %s\n", p.nome);
    printf("Cognome: %s\n", p.cognome);
    printf("Eta: %d\n", p.eta);
    printf("Altezza: %.2f\n", p.altezza);

    return 0;
}

Output

Nome: Marco
Cognome: Bianchi
Eta: 28
Altezza: 1.75

🔍 Perché usare le strutture?

Senza struct dovremmo scrivere:

char nome[30];
char cognome[30];
int eta;
float altezza;

Con le strutture invece basta:

struct Persona persona1;

Il codice diventa molto più ordinato.


👥 Più variabili della stessa struttura

Possiamo creare tutte le persone che vogliamo.

struct Persona persona1;
struct Persona persona2;
struct Persona persona3;

Ognuna possiede i propri dati.


📋 Inizializzare una struttura

È possibile assegnare i valori direttamente durante la dichiarazione.

struct Persona p =
{
    "Luca",
    "Verdi",
    40,
    1.82
};

Successivamente:

printf("%s", p.nome);

📦 Array di strutture

Uno degli utilizzi più comuni consiste nel creare un array di strutture.

struct Persona elenco[100];

In questo modo possiamo memorizzare 100 persone.


✨ Inserimento dati

strcpy(elenco[0].nome, "Anna");
strcpy(elenco[0].cognome, "Neri");

elenco[0].eta = 31;

Per la seconda persona:

strcpy(elenco[1].nome, "Paolo");
strcpy(elenco[1].cognome, "Rossi");

elenco[1].eta = 45;

🔄 Utilizzo con un ciclo

for(int i=0;i<2;i++)
{
    printf("%s\n", elenco[i].nome);
}

Output:

Anna
Paolo

🧩 Strutture contenenti altre strutture

Le strutture possono contenere altre strutture.

struct Data
{
    int giorno;
    int mese;
    int anno;
};

struct Persona
{
    char nome[30];
    struct Data nascita;
};

Accesso:

persona.nascita.giorno = 15;
persona.nascita.mese = 8;
persona.nascita.anno = 1998;

📌 Typedef e struct

Molti programmatori preferiscono usare typedef.

typedef struct
{
    char nome[30];
    int eta;
} Persona;

Adesso non serve più scrivere:

struct Persona p;

ma semplicemente:

Persona p;

Il codice è più pulito.


📤 Copiare una struttura

A differenza degli array, una struttura può essere copiata direttamente.

Persona p1 =
{
    "Marco",
    30
};

Persona p2;

p2 = p1;

Dopo la copia entrambe conterranno gli stessi dati.


📍 Passare una struttura ad una funzione

Una struttura può essere passata come parametro.

void stampa(Persona p)
{
    printf("%s\n", p.nome);
}

Chiamata:

stampa(p1);

⚡ Passaggio tramite puntatore

Per evitare copie inutili si utilizza spesso un puntatore.

void stampa(Persona *p)
{
    printf("%s\n", p->nome);
}

La chiamata sarà:

stampa(&p1);

Qui compare l'operatore ->.

Infatti:

p->nome

equivale a:

(*p).nome

ma è molto più leggibile.


🧠 Dimensione di una struttura

Possiamo conoscere la memoria occupata.

printf("%zu", sizeof(struct Persona));

oppure

printf("%zu", sizeof(Persona));

Il risultato dipende dal compilatore e dall'allineamento della memoria.


⚠ Padding della memoria

Il compilatore può inserire automaticamente alcuni byte inutilizzati tra i campi della struttura.

Ad esempio:

struct Test
{
    char c;
    int numero;
};

Non sempre la dimensione sarà:

1 + 4 = 5 byte

Potrebbe essere:

8 byte

per motivi di allineamento della memoria.

Questo fenomeno prende il nome di padding.


🚀 Strutture dinamiche

Le strutture possono essere allocate dinamicamente.

#include <stdlib.h>

Persona *p;

p = malloc(sizeof(Persona));

Successivamente:

strcpy(p->nome, "Mario");
p->eta = 45;

Infine:

free(p);

💡 Un esempio pratico: archivio studenti

Immaginiamo di voler memorizzare i dati degli studenti.

typedef struct
{
    int matricola;
    char nome[40];
    char cognome[40];
    float media;
} Studente;

Creiamo un archivio:

Studente studenti[500];

Ogni elemento rappresenta uno studente completo.

È proprio questo il principio utilizzato nei database, nei programmi gestionali e nei software scolastici.


📖 Quando usare le strutture?

Le strutture sono ideali quando occorre rappresentare oggetti reali, ad esempio:

  • 👤 Persone

  • 🚗 Automobili

  • 📚 Libri

  • 🏠 Abitazioni

  • 📦 Prodotti

  • 🎮 Giocatori

  • 🏦 Conti correnti

  • 🧾 Fatture

  • 🛒 Ordini

  • 🎓 Studenti

In tutti questi casi una struttura consente di raggruppare informazioni correlate in modo semplice ed efficace.


✅ Conclusione

Imparare a utilizzare le strutture è fondamentale per affrontare argomenti più avanzati come liste concatenate, alberi, file binari, gestione della memoria dinamica e programmazione orientata agli oggetti in altri linguaggi. Una buona padronanza delle struct rappresenta quindi un passo essenziale per qualsiasi programmatore C.