Iniziamo con la versione semplice:
char (*f)(char c, int i)
questa e' la
dichiarazione di un
puntatore ad una funzione che riceve in ingresso un carattere ed un intero e ritorna un carattere
Supponi di avere il seguente codice:
char converti(char c, int i)
{
return (char)(c+i);
}
allora puoi scrivere:
char (*f)(char c, int i);
f = converti;
A questo punto puoi usare
f invece che
converti:
char c = (*f)('A', 0)
A che serve i puntatori a funzione?
Banale: poter utilizzare diverse funzioni di conversione senza dover cambiare o ricompilare il codice che le utilizza.
Concettualmente: il codice che utilizza la funzione di conversione
non e' interessato a come viene fatta la conversione, ed particolare a quale funzione chiamare, ma solo che deve essere fatta.
Quale funzione chiamare potrebbe essere deciso in fase di configurazione del programma, operazione fatta alla partenza.
Secondo:
che cosa e' shift.
Ovviamente e' un tipo di dato, ma non e' un tipo predefinito dal linguaggio.
Molto probabilmente e' un intero, che serve per implementare il seguente ragionamento:
tu mi passi il carattere c, io a c aggiungo 'shift' e applico l'algoritmo di cifratura.
Ad esempio, se lo shift e' 3, e viene passato 'a', il carattere da cifrare sara' 'd' (ovviamente, e se viene passato 'z' ?).