utfcode
[Link] 3.10 UTF-8 input encoding 13.06.2000
scanner for code UTF-8 installed.
1
I Record e le Struct in C++
Strutture Dati Eterogenee e Operazioni Fondamentali
Appunti di Informatica
21 luglio 2026
Indice
1 I Record: Concetto Generale 3
2 Definizione e Dichiarazione di una struct 3
2.1 Sintassi di Definizione del Tipo . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Dichiarazione e Inizializzazione delle Variabili . . . . . . . . . . . . . . . . 3
3 Operazioni sui Record 4
3.1 1. Accesso ai Campi (Operatore Punto .) . . . . . . . . . . . . . . . . . . 4
3.2 2. Assegnazione Tra Record del Medesimo Tipo . . . . . . . . . . . . . . . 4
3.3 3. Confronti Relazionali (Uguaglianza/Disuguaglianza) . . . . . . . . . . . 4
4 Strutture Dati Composte con Record 5
4.1 1. Record Nidificati (Struct dentro Struct) . . . . . . . . . . . . . . . . . . 5
4.2 2. Vettori di Record (Array di Struct) . . . . . . . . . . . . . . . . . . . . 5
5 Tabella di Confronto: Vettori, Matrici e Record 6
2
1 I Record: Concetto Generale
A differenza dei vettori e delle matrici (che sono strutture dati omogenee), un **record**
è una struttura dati **eterogenea**, composta da un insieme finito di elementi presi anche
da tipi di dato differenti.
• Campi: I singoli elementi che costituiscono un record sono detti campi o membri.
• Identificazione: Ogni campo è identificato da un proprio **nome (identificatore)**
anziché da un indice numerico.
• Allocazione: I campi occupano blocchi contigui o allineati di memoria, con una
dimensione totale pari alla somma delle dimensioni dei singoli campi (più eventuale
padding di allineamento del compilatore).
Matematicamente, un tipo di dato Record R composto da k campi dei tipi T1 , T2 , . . . , Tk
rappresenta il **prodotto cartesiano** dei tipi dei suoi componenti:
R = T1 × T2 × · · · × Tk
Un’istanza r ∈ R è una k-upla ordinata:
r = (v1 , v2 , . . . , vk ) con vi ∈ Ti
2 Definizione e Dichiarazione di una struct
In linguaggio C++, un record viene implementato tramite la parola chiave struct.
2.1 Sintassi di Definizione del Tipo
La definizione del nuovo tipo di dato astratto non alloca memoria; descrive solo il ”mo-
dello” o la ”sagoma” della struttura.
1 struct Persona {
2 string nome ;
3 string cognome ;
4 int eta ;
5 double altezza ; // in metri
6 };
Listing 1: Definizione di un tipo di dato Persona
2.2 Dichiarazione e Inizializzazione delle Variabili
Una volta definito il tipo Persona, è possibile dichiarare ed eventualmente inizializzare
variabili di quel tipo (allocazione di memoria effettiva):
3
1 // Dichiarazione semplice
2 Persona studente1 ;
3
4 // Dichiarazione con inizializzazione posizionale ( C ++11
aggregate initialization )
5 Persona studente2 = { " Mario " , " Rossi " , 18 , 1.75};
Listing 2: Dichiarazione e inizializzazione di istanze
—
3 Operazioni sui Record
3.1 1. Accesso ai Campi (Operatore Punto .)
L’accesso diretto ad un singolo campo di una struct avviene tramite l’**operatore di
selezione diretta** (punto .).
[Link]
1 // Assegnazione singola
2 studente1 . nome = " Giulia " ;
3 studente1 . cognome = " Bianchi " ;
4 studente1 . eta = 17;
5
6 // Input e Stampa diretta di un campo
7 cout << " Inserisci l ’ altezza di " << studente1 . nome << " : " ;
8 cin >> studente1 . altezza ;
9
10 cout << " Studente : " << studente1 . cognome << " " << studente1 .
nome << endl ;
Listing 3: Lettura e scrittura dei campi
3.2 2. Assegnazione Tra Record del Medesimo Tipo
È possibile assegnare direttamente un record a un altro dello stesso tipo. Il compilatore
esegue una copia **bit a bit** (o campo per campo) di tutti i membri.
R1 ← R2 ⇐⇒ ∀i, R1 .campoi = R2 .campoi
1 Persona studente3 ;
2 studente3 = studente2 ; // Copia automatica di tutti i campi
Listing 4: Assegnazione diretta di record
3.3 3. Confronti Relazionali (Uguaglianza/Disuguaglianza)
Nota importante: In C++ standard **non** sono definiti automaticamente gli opera-
tori di confronto (==, !=, <) tra due struct. I confronti devono essere effettuati campo
per campo o sovraccaricando gli operatori (operator overloading).
4
1 // Verifica se due studenti hanno lo stesso cognome e nome
2 if ( studente1 . cognome == studente2 . cognome && studente1 . nome ==
studente2 . nome ) {
3 cout << " I due studenti sono omonimi . " << endl ;
4 }
Listing 5: Confronto manuale tra record
—
4 Strutture Dati Composte con Record
4.1 1. Record Nidificati (Struct dentro Struct)
Un campo di un record può essere a sua volta un altro record.
1 struct Data {
2 int giorno ;
3 int mese ;
4 int anno ;
5 };
6
7 struct Studente {
8 string matricola ;
9 Persona anagrafica ; // Campo di tipo Persona
10 Data dataNascita ; // Campo di tipo Data
11 };
12
13 // Accesso a campi annidati
14 Studente s ;
15 s . anagrafica . nome = " Laura " ;
16 s . dataNascita . anno = 2005;
Listing 6: Uso di record nidificati
4.2 2. Vettori di Record (Array di Struct)
L’unione di vettori e record permette di rappresentare collezioni di entità complesse
(equivalente ad una tabella di database).
1 const int MAX = 100;
2 Studente classe [ MAX ];
3 int N = 30;
4
5 // Scansione e azzeramento dell ’ anno di nascita per tutti gli
studenti
6 for ( int i = 0; i < N ; i ++) {
7 cout << " Matricola studente " << i << " : " << classe [ i ].
matricola << endl ;
8 }
Listing 7: Gestione di un vettore di record
—
5
5 Tabella di Confronto: Vettori, Matrici e Record
Caratteristica Vettore Matrice Record (struct)
Omogeneità Omogenea Omogenea Eterogenea
Indicizzazione Un indice (i) Due indici (i, j) Nome del campo
Acceso al singolo elemento O(1) O(1) O(1)
Assegnazione diretta No (richiede ciclo) No (richiede ciclo) P Sı̀ (A = B)
Dimensione fisica N × size(T ) R · C × size(T ) size(Ti ) + padding
Tabella 1: Confronto tra le principali strutture dati lineari e composte.