1) funzione(const char* stringa)
lui usa smpre const.. che cambia? io non lo uso mai
mettendo const dici al compilatore che la variabile passata non è modificabile, quindi ad esempio se nella funzione cerchi di fare qlcosa del tipo stringa[0] = '2' ti dà errore. Ad esempio se vuoi fare una funzione per calcolare la lunghezza di una stringa e vuoi garantirti che la funzione non modificherà l'argomento lo puoi dichiare const.

lui dichiara spesso variabili in qualsiasi punto del codice... io ero abituato a dichiararle sempre all'inizio delle funzioni... cambia qualcosa oltre alla legibilità?
direi di no.

3) ero abituato (dal testo che ho usato) a esplicitare sempre un casting per il puntatore restituito da malloc, lui non lo fa.. esempio:

io:
char* stringa = (char*) malloc(sizeof(char)*10);
lui:
char* stringa = malloc(sizeof(char)*10);

capisco che effettivamente è un po' ridondante... ma sul mio testo lo fa sempre e comunqu e avevo preso quest'abitudine... quando va esplicitato e quando no?
Il C effetua atuomaticamente i cast fra le variabili, a differenza del C++; in C++ sarebbe corretto solo il tuo codice, ma non quello del prof, a meno di non dire al compilatore di non preoccuparsi delle icncpompatibilità di tipo (passandogli l'opzione -fpermissive nel caso del g++). Il C++ è da questo punto di vista un linguaggio più 'sicuro', difatti spesso anche chi programma in C utilizza il g++ per compilare, perchè effettuando più controlli a tempo di compilazione rileva subito degli errori, che nonsarebbero rilevati dal C. Personalmente ritengo buona regola di programmazione esplicitare tutti i cast, cosi se stai commettendo qualche erorre te ne accorgi.