12: Typedef, enum, struct (Definizione di nuovi tipi)

Nella guida precedente abbiamo definito i principali tipi predefiniti del linguaggio C e abbiamo accennato al fatto che potessero esserne definiti dei nuovi dall’utente, attraverso l’uso della typedef. Oggi approfondiamo meglio questo argomento.

  • Tipi semplici User-defined

Il nuovo tipo può essere ridefinito dando un altro nome a un tipo preesistente attraverso la parola chiave typedef. La sintassi sarà la seguente: typedef TipoEsistente NuovoTipo;

Per esempio:

typedef int num; //creo un nuovo tipo di nome 'num', che è un numero intero

typedef char Nuovocarattere;

typedef num Nuovonum; //creo un tipo nuovo da un altro tipo definito da me
  • Elencazione esplicita dei valori

Posso definire un nuovo tipo elencando all’interno delle parentesi { } tutti i suoi valori, ma annoverandoli sotto un unico identificativo. In questo caso usiamo l’espressione typedef enum. La sintassi sarà: typedef enum {elemento1, elemento2,…, elementoN} NuovoTipo;

Per esempio:

typedef enum {invidia, accidia, avarizia, lussuria, superbia, gola, ira} ViziCapitali;

ViziCapitali primo, secodo; //dichiaro due variabili del nuovo tipo

primo=ira; //assegno alla variabile il valore ira

I tipi enumerati ammettono tutte le operazioni applicabili agli interi (aritmetiche, di confronto, di assegnamento, etc.), quindi si comportano a tutti gli effetti come il tipo integer .

  • Tipi strutturati user-defined (array, struct)

    Così come è possibile definire un nuovo tipo semplice, la stessa cosa si può fare con un tipo strutturato, come un array. Per esempio:

    typedef int Vett[10]; // creo un nuovo tipo di nome "Vett di 10 elementi di tipo int"
    
    Vett lista; //dichiaro una variabile di tipo Vett
    

    Ora, mentre un array contiene al suo interno elementi omogenei (tutti dello stesso tipo), il C fornisce un costruttore che permette di aggregare informazioni e elementi eterogenei (di tipi differenti): la struct, che letteralmente significa struttura. Questi elementi, invece, vengono definiti campi.

    Vediamo ora un esempio di dichiarazione di un tipo struct:

    typedef struct {
    
    int Anno;
    
    char Nome [20];
    
    char Corso;
    
    } Studente;
    
    Studente St1, St2; //dichiarazione di variabili di tipo Studente
    

    Quindi la sintassi è : la parola chiave typedef struct, le parentesi { } all’interno delle quali metteremo i vari campi, composti a loro volta da tipo e identificatore (nel nostro caso, abbiamo una variabile di tipo int chiamata Anno, una di tipo Char chiamata Corso e un array di caratteri, chiamato Nome), l’identificativo del nuovo tipo struct (nel nostro esempio, Studente) e il terminatore ;.

    Oppure per dichiarare in maniera abbreviata nuove variabili di tipo struct, posso omettere la typedef e indicare direttamente i nomi delle variabili, al posto dell’identificativo. Per esempio, facendo riferimento a quello precedente:

    struct {
    
    int Anno;
    
    char Nome [20];
    
    char Corso;
    
    } St1,St2; //ho dichiarato direttamente le variabili che hanno come tipo
    //la suddetta struct
    

    Ora, per poter accedere ai vari campi della struttura e poterli inizializzare, si scrive l’identificatore della struttura, seguito da un punto (dot) e dall’identificatore del campo a cui si vuole accedere. Per esempio, se volessi dichiarare che lo studente St1, fa il terzo anno, si chiama “Puffetta” e fa il corso “B”, scriverò:

    St1.Anno=3;
    
    St1.Nome= 'Puffetta';
    
    St1.Corso= 'B';
    

    Per il resto, valgono le stesse proprietà dei tipi semplici.

    La guida è terminata. Se avete domande, o non è chiaro qualcosa, scrivetecelo in un commento. Nel prossimo articolo vedremo i puntatori. Non perdetelo!

Please follow and like us: