Le strutture o struct in C

Le strutture o struct in C sono dei tipi di dati utilizzabili da parte dell’utente che permettono di raggruppare un insieme di variabili, anche di diverso tipo, sotto un unico nome comune. Il principio alla base è simile a quanto accade con gli array, con l’unica differenza che quest’ultimi immagazzinano variabili dello stesso tipo ed in maniera ordinata.

La sintassi delle strutture nel linguaggio C è la seguente:

struct nome_struttura{ tipoDato_1; tipoDato_2; … }(una o più variabili di tipo struct);

dove struct è la keyword necessaria per poter definire una struttura, nome_struttura è un campo opzionale che indica il nome della struttura, utilizzabile per definire successivamente delle strutture di quel tipo. All’interno della struttura vengono definiti i vari tipi di dato richiesti, invece, prima dell’ultimo punto e virgola, è possibile (campo opzionale) definire una o più variabili di quel tipo di struttura.

Nello specifico le strutture vengono utilizzate per rappresentare dei record, ovvero degli oggetti composti da un insieme di campi o elementi. Per capire meglio il funzionamento delle strutture in C, consideriamo il seguente esempio in cui creiamo una struttura per gestire i dati di una persona (nome, cognome ed età):

struct Persona{     char nome[50];     char cognome[50];     int eta; };

In questo modo viene dichiarata una struttura di nome "Persona" con all’interno i campi richiesti. A questo punto è possibile dichiarare una variabile di tipo struct Persona usando la seguente sintassi:

struct Persona p1;

oppure, è possibile dichiarare una o più variabili di tipo struct Persona già all’interno della dichiarazione della struttura stessa:

struct Persona{     char nome[50];     char cognome[50];     int eta; } p1, p2;

In questo modo si possono utilizzare le variabili p1 e p2, oppure dichiarare una nuova variabile di tipo struct Persona utilizzando la sintassi precedentemente mostrata.

Accedere ai campi delle strutture

Per poter accedere ai campi di una struttura si fa uso della variabile di tipo struct e dal campo a cui si vuole accedere, utilizzando un "." come viene mostrato di seguito:

variabile_struttura.campo

Ad esempio consideriamo la variabile struct di tipo Persona p1 precedentemente dichiarata, possiamo accedere al suo campo nome nel seguente modo:

p1.nome

In questa maniera è possibile accedere ai campi in modo da leggerne il contenuto o per immagazzinare delle informazioni. Per assegnare i valori ai campi di una struttura, bisogna fare attenzione al tipo di dato del campo. Infatti per modificare un campo di tipo array di chars, come il campo nome o cognome, dobbiamo fare uso di particolari funzioni quali strcpy o gets (anche se quest'ultima risulta essere deprecata e quindi il suo uso è sconsigliato):

int main(){     struct Persona p1, p2;     p1.eta = 22;     p2.eta = 56;     strcpy(p1.nome, "Mario");     strcpy(p1.cognome, "Rossi");     // Oppure possiamo usare la funzione gets per chiedere      // all'utente di inserire un nome ed un cognome.     printf("Inserisci nome per Persona p2: ");     gets(p2.nome);     printf("Inserisci cognome per Persona p2: ");     gets(p2.cognome);     printf("Persona p1 si chiama: %s %s ed ha %d anni\n", p1.nome, p1.cognome, p1.eta);     printf("Persona p2 si chiama: %s %s ed ha %d anni\n", p2.nome, p2.cognome, p2.eta);     return 0; }

Altrimenti è possibile inizializzare i campi delle strutture dichiarate scrivendo i valori tra parentesi graffe, come nel seguente modo:

struct Persona p1 = {"Mario", "Rossi", 22}; struct Persona p2 = {"Giuseppe", "Verdi", 56};

Esempio di utilizzo delle strutture in C

Di seguito viene riportato un breve esempio di utilizzo delle strutture all’interno del linguaggio C, per creare una struttura di tipo macchina per gestire la marca, il modello, la cilindrata ed il costo di tre macchine diverse.

#include <stdio.h> #include <string.h> struct macchina{     char marca[50];     char modello[50];     int cilindrata;       float costo; }; int main(){     struct macchina m1, m2, m3;     strcpy(m1.marca, "FIAT");     strcpy(m1.modello, "Panda");     m1.cilindrata = 1242;     m1.costo = 12000;          strcpy(m2.marca, "VW");     strcpy(m2.modello, "Golf");     m2.cilindrata = 999;     m2.costo = 28400;     strcpy(m3.marca, "Ford");     strcpy(m3.modello, "Focus");     m3.cilindrata = 2261;     m3.costo = 40200;     printf("Catalogo macchine: \n");     printf("%s %s %d %.2f\n", m1.marca, m1.modello, m1.cilindrata, m1.costo);     printf("%s %s %d %.2f\n", m2.marca, m2.modello, m2.cilindrata, m2.costo);     printf("%s %s %d %.2f\n", m3.marca, m3.modello, m3.cilindrata, m3.costo);     return 0; }