STRUTTURE
struct
nome_struttura {
tipo_campo1
nome_campo1;
tipo_campo2
nome_campo2;
...
tipo_campoN
nome_campoN;
} ;
utili per memorizzare
sequenze contigue di valori non omogenei (limite degli array)
gli elementi di una
struttura sono detti campi, identificati da un nome e
da un tipo (fondamentale o derivato)
es.
libretto universitario:
libretto 30 linee
nome esame data voto
struct
Esame{
char
nome[10];
char
data[7];
int
voto
}
“Esame” mi
caratterizza triple di nome-data-voto
|
ARRAY
|
STRUTTURE
|
|
elementi omogenei
|
no
|
|
contiguità garantita
|
niente contiguità =>
utilizzo i selettori
|
|
non posso utilizzare gli
operatori “==” ”!=” per testare il
contenuto
|
idem
|
|
NO = (operatore di assegnamento
tra 2 elementi, con 2 array devo utilizzare strcpy, con 2
strutture invece posso utilizzarlo)
|
SI = (si possono assegnare
variabili di tipo struttura a variabili dello stesso tipo
struttura)
|
|
memoria condivisa nelle
chiamate a funzioni (passaggio per indirizzo)
|
NO
|
Per accedere ai campi
di una variabile di tipo struttura si fa uso dell’operatore
punto (.)
d.nome
= “Programmazione”; NO, devo utilizzare:
strcpy(d.nome,
“Programmazione”);
d.data
= “100105” NO:
strcpy(d.data,
“150105”);
d.voto
= 18;
è possibile
definire strutture di strutture: le strutture che compaiono nei
campi di una struttura devono essere state definite prima della
struttura chele contiene
es.
typedef
struct {
int
giorno;
char
*mese;
int
anno;
}
Data;
typedef
struct {
char
*marca;
char
*modello;
int
numero_vendute;
Data
data_prima_produzione;
}
Automobile;
Automobile
salone[100];
posso fare affidamento
all'ordine in cui ho dichiarato gli elementi della struttura solo nel
momento in cui la inizializzo:
struct
Data{
int
giorno;
int
mesi;
int
anno;
}
struct
Data g = {15,1,2005}
quando passo g a una
funzione non sto passando un indirizzo ma un valore (a differenza
degli array)
struct
A{
char
*p;
int
p;
}a;
struct
B{
char
p[5];
int
q;
}b;
se io voglio passare
un array ad una procedura senza che i suoi valori possano essere
modificati dalla procedura stessa è sufficiente che io
dichiari un array come valore di tipo struttura
se per problemi di
efficienza devo evitare copie degli array:
struct
T2{
int
*a;
};
struct
T{
int
a, b;
int
c[10];
struct
T d; //NO! (non sa quanta memoria deve allocare => allocazione
ricorsiva (saturazione))
struct
T *e; // posso farlo
};
vedi disegno albero
struct
Nodo{
int
tag;
struct
Nodo *sin;
struct
Nodo *des;
};
struct
Nodo nodo2, nodo7, nodo1, nodo9, nodo8;
nodo9.tag
= 9;
nodo9.sin
= NULL;
nodo9.des
= NULL;
nodo8.tag
= 7;
nodo8.sin
= NULL;
nodo8.des
= NULL;
nodo7.tag
= 7;
nodo7.sin
= & nodo9;
nodo7.des=
& nodo8;
nodo3.tag
= 7;
nodo3.sin
= & nodo7;
nodo3.des=
& nodo1;
|