Dispensa II.6 versione 1.0 mail: lamonica@associatesonline.it Pagina 1 di 5
STRUTTURE
La dispensa di seguito proposta si pone come tutorial per poter porre le basi per la creazione di strutture e la loro gestione dinamica nel linguaggio C / C ++
La struttura ( struct )
Le strutture del C sostanzialmente permettono l’aggregazione di più variabili, in modo simile a quella degli array, ma a differenza di questi non ordinata e non omogenea (una struttura può contenere variabili di tipo diverso). Per denotare una struttura si usa la parola chiave struct seguita dal nome identificativo della struttura, che è opzionale.
// dichiarazione della struct struct libro
{
char titolo[100];
char autore[50];
int anno_pubblicazione;
float prezzo;
};
//dichiarazione dell'istanza biblio struct libro biblio;
Dispensa II.6 versione 1.0 mail: lamonica@associatesonline.it Pagina 2 di 5
La definizione di nuovi tipo ( typedef )
Per definire nuovi tipi di dato viene utilizzata la funzione typedef. L’uso di typedef, combinato con struct ci permette di creare tipi di dato molto complessi, come mostrato nell’esempio seguente:
typedef struct libro {
char titolo[100];
char autore[50];
int anno_pubblicazione;
float prezzo;
} t_libro;
t_libro guida = {"Guida al C", "Fabrizio Ciacchi", 2003, 45.2};
Definito un nuovo tipo di nome t_libro, ( tipo complesso composto da una struttura), è possibile utilizzare il nuovo tipo come ogni altro, ad esempio possiamo creare un array di elementi di tipo t_libro.
t_libro raccolta[5000];
Per accedere agli elementi dell’array, o per inizializzare i valori, è sufficiente utilizzare l’indice per identificare l’elemento dell’array ed il punto (.) per accedere alle variabili interne del tipot_libro.
Dispensa II.6 versione 1.0 mail: lamonica@associatesonline.it Pagina 3 di 5 // assegna un valore al prezzo del 341mo libro
raccolta[340].prezzo = 67.32;
// assegna ad una variabile int l'anno di pubblicazione del 659mo libro int anno = raccolta[658].anno_pubblicazione;
// stampa il titolo del 23mo libro printf ("%s n", raccolta[22].titolo);
Dispensa II.6 versione 1.0 mail: lamonica@associatesonline.it Pagina 4 di 5
Puntatori e strutture
Definiamo un record e dichiariamo una variabile puntatore:
typedef struct {
int PrimoCampo;
char SecondoCampo;
} TipoDato;
TipoDato x, *P;
P = &x;
Per accedere al primo campo della variabile x attraverso il puntatore p dobbiamo usare la “dot notation”
(*P).PrimoCampo = 12;
/* Inserisce 12 nel campo PrimoCampo di x */
Oppure è possibile utilizzare la forma abbreviata
P–>PrimoCampo = 12;
Dispensa II.6 versione 1.0 mail: lamonica@associatesonline.it Pagina 5 di 5
Operatore sizeof
L’operatore sizeof produce il numero di byte occupati da ciascun elemento di un array o da un array nel suo complesso.
Supponendo che si usano quattro byte (un word … in italiano una parola) per la memorizzazione di un valore int:
int a[5];
sizeof(a[2]) Restituisce il valore 4
sizeof(a) Restituisce il valore 20.
Il nome di una variabile di tipo array viene considerato in C come l’indirizzo della prima parola di memoria che contiene il primo elemento della variabile di tipo array (lo 0-esimo …).
Se ne deduce:
• a “punta” a una parola di memoria esattamente come un puntatore;
• a punta sempre al primo elemento della variabile di tipo array (è un puntatore “fisso” al quale non è possibile assegnare l’indirizzo di un’altra parola di memoria).