Can anyone describe what following statements would mean in C :

long (*alpha(void))(int);

double (**beta(void))(int);

short *(*(*(*gamma)(void))[8])(void);