Ho risolto. In pratica ho capito che devo passare alla funzione un puntatore generico, ma che punti alla struct cat che ho dichiarato fuori dal main, altrimenti se do un nome generico alla struct nella funzione, non funziona. Non posso scrivere
codice:
void stampa (struct strgenerica *pt,int n_prod) {..} <---
Ma devo scrivere cosi.}
codice:
struct cat{ <----
char *codice, *nome_prodotto, *categoria, *data;
int prezzo,unita;
};
void stampa(struct cat *pt,int n_prod);
int main(int argc, const char * argv[]) {
...
stampa(p_cat, n_prodotti);
...
}
void stampa (struct cat *pt,int n_prod) {...} <----
Però ho ancora un po' di dubbi.
Se per esempio avessi dichiarato la struct all'interno del main
codice:
int main(int argc, constchar * argv[]) {
struct cat{
char *codice, *nome_prodotto, *categoria, *data;
int prezzo,unita;
};
}
come avrei dovuto scrivere la funzione e passare il puntatore alla struct, visto che al di fuori del main non è visibile il nome della struct se dichiarata all'interno di esso?
Oppure le struct, per usarle in questo modo devono essere dichiarate al di fuori del main, come ho fatto io?
Così non diventano una sorta di 'variabili globali'? 
Grazie per la risposta