In primo luogo devi decidere se usare la sintassi "struct NomeStruttura" o "NomeStruttura e basta" per chiamare le strutture.
In C, a differenza del C++, il nome del tipo delle strutture normalmente devono essere preceduti da struct. Se cioè tu dichiari una struttura di questo genere:
codice:
struct Punto
{
int x;
int y;
};
poi, per creare una variabile che abbia il tipo della struttura e usarla dovrai fare
codice:
struct Punto UnPunto;
UnPunto.x=100;
UnPunto.y=36;
.
Alcuni trovano seccante dover riscrivere struct tutte le volte, nel qual caso si ricorre ad un workaround: si crea una struttura anonima e se ne crea un alias tramite typedef; dato che gli alias creati tramite typedef non necessitano di "struct" davanti, si può fare così:
codice:
typedef struct /* nota che qui non ho specificato il nome */
{
int x;
int y;
} Punto;
/* ... */
Punto UnPunto;
UnPunto.x=100;
UnPunto.y=36;
Stabilito quale sintassi utilizzare (è bene non mischiarle onde evitare casini), viene da sé la dichiarazione di funzioni a cui passare delle strutture.
La scelta del passaggio per puntatore o per copia dipende da considerazioni logiche e da considerazioni di efficienza.
Se la funzione deve modificare il contenuto della struttura, la struttura andrà passata per forza via puntatore (altrimenti le modifiche effettuate dalla funzione si ripercuoteranno solo sulla copia della struttura locale alla funzione):
codice:
void Funzione(struct Punto * Pt);
/* oppure, a seconda della scelta della sintassi da seguire */
void Funzione(Punto * Pt);
Se la struttura è piccola e la funzione non la deve modificare, allora va più che bene il passaggio per valore:
codice:
void Funzione(struct Punto Pt);
/* oppure, a seconda della scelta della sintassi da seguire */
void Funzione(Punto Pt);
Qualora la struttura fosse piuttosto grande e l'overhead relativo alla copia quindi sia sensibile, è preferibile usare comunque il passaggio per puntatore. Se la funzione non deve comunque modificare la struttura, un modo per rendere chiaro ciò è usare un puntatore costante:
codice:
void Funzione(const struct Punto * Pt);
/* oppure, a seconda della scelta della sintassi da seguire */
void Funzione(const Punto * Pt);