I believe, for example, the first one is a pointer to a function that takes an int pointer argument and returns a type of float. The others are just adding onto this, if I got it right.
C's declarators are designed to be suggestive of usage. For example, given the declaration float *x;
The syntax is suggesting that the expression *x has type float.
Similarly, given the declaration (a) float (*x)(int *a);
The syntax is suggesting that the expression (*x) has type float(int*) (it does) and therefore that (*x)(some_pointer_to_int) has type float.
Hopefully I didn't make any typos while typing this out:
/* (a) */ float (*x)(int *a);
/* Declare x as pointer to function returning a float and
accepting one argument of type int*. */
/* (b) */ float (*x(int *a))[20];
/* Declare x as a function returning a pointer to array of
20 elements of type float and accepting one argument of type
int*. */
/* (c) */ float x(int (*a)[]);
/* Declare x as a function returning float and accepting one argument of type int (*a)[]
int(*)[] is a pointer to array of unknown bound with an element type of int.
This is not valid C++. It is valid C.
*/
/* (d) */ float x(int *a[]);
/* Declare x as a function returning float and accepting one argument of type int**. */
/* (e) */ float *x(int a[]);
/* Declare x as a function returning a pointer to float and accepting
one argument of type int*. */
/* (f) */ float *x(int (*a)[]); /* Like (c), but returning float* instead. */
/* (g) */ float *x(int *a[]); /* Like (d), but returning float* instead. */
/* (h) */ float (*x)(int (*a)[]); /* Like (c), but x is a pointer-to-function instead. */
/* (i) */ float *(*x)(int *a[]); /* Like (g), but x is a pointer-to-function instead. */
/* (j) */ float (*x[20])(int a);
/* Declare x as a array of 20 elements with type float(*)(int).
float(*)(int) is the type of a pointer to function returning float and accepting one argument of type int. */
/* (k) */ float *(*x[20])(int *a); /* Like (j), but the element type of the array is float*(*)(int*). */