English to C Declarations
int g1; // an int
int *g2; // a pointer to an int
int g3[3]; // an array of 3 int
int *g4[3]; // an array of 3 pointers to int
int (*g5)[3]; // a pointer to an array of 3 ints
int *(*g6)[3]; // a pointer to an array of 3 pointers to int
int *(*g7)[3][5]; // a pointer to an array of 3 arrays of 5 pointers to int
int *(*(*g8)[3])[5]; // a pointer to an array of 3 pointers to an array of 5 pointers to int
void (*g9[5])(int); // an array of 5 pointers to functions that take an int and return nothing
double *g10(int, int); // a function taking an int and an int and returning a pointer to a double
int (*g11(void))[10]; // a function that takes nothing and returns a pointer to an array of 10 int
// a function that takes an array of 3 doubles and returns a pointer to a function
// that takes nothing and returns a float
float (*g12(double [3]))(void);
// a function that takes a pointer to a poiner to an int and returns a pointer to an
// array of 5 pointers to funtions that take an array of const char and return an it
int (*(*g13(int **))[5])(const char []);