C to English Declarations
int f1; /* an int */
int *f2; /* a pointer to an int */
int f3[3]; /* an array of 3 ints */
int *f4[3]; /* an array of 3 pointers to int */
int (*f5)[3]; /* a pointer to an array of 3 ints */
int *(*f6)[3]; /* a pointer to an array of 3 pointers to int */
int f7[3][4]; /* an array of 3 arrays of 4 ints (a 3x4 array of int) */
int *f8[3][4]; /* an array of 3 arrays of 4 pointers to int (a 3x4 array of pointer to int) */
int (*f9)[3][4]; /* a pointer to an array of 3 arrays of 4 ints (a pointer to 2 above) */
int *(*f10)[3][4]; /* a pointer to an array of 3 arrays of 4 pointers to int (a pointer to 2 above) */
int (*f11[3])[4]; /* an array of 3 pointers to an array of 4 ints */
int *(*f12[3])[4]; /* an array of 3 pointers to an array of 4 pointers to int */
void f21(void); /* a function taking nothing and returning nothing */
void f22(int, float); /* a function taking an int and a float and returning nothing */
void f23(int i, float f); /* a function taking an int and a float and returning nothing */
int *f24(void); /* a function taking nothing and returning a pointer to an int */
int (*f25)(void); /* a pointer to a function taking nothing and returning an int */
int **f26(void); /* a function taking nothing and returning a pointer to a pointer to an int */
int *(*f27)(void); /* a pointer to a function taking nothing and returning a pointer to an int */
double *(*f28)(int, float *); /* a pointer to a function taking an int and a pointer to a float and returning a pointer to a double */
int **(**f29)(void); /* a pointer to a pointer to a function taking nothing and returning a pointer to a pointer to an int */
int f31()[5]; /* error: function returns array */
int *f31a[5](); /* error: array element type cannot be function */
int (*f31b[5])(); /* correct, an array of 5 pointers to functions returning int */
int f32()(); /* error: function returns function */
int *f32a()(); /* error: function returns function */
int (*f32b())(); /* correct, a function returning a pointer to a function returning an int */
int f33[5](); /* error: array element type cannot be function (array of funtions) */
int *f33a[5](); /* error: array element type cannot be function (array of funtions) */
int (*f33b[5])(); /* correct, an array of 5 pointers to functions returning an int */
/* a pointer to an array of 5 pointers to functions taking a pointer to a const char and an int */
/* and returning a pointer to a BITMAP struct */
struct BITMAP *(*(*f41)[5])(const char *, int);
/* a function taking a pointer to a pointer to a BITMAP struct and returning a pointer to an array */
/* of 5 pointers to unsigned int */
unsigned int *(*f42(struct BITMAP **))[5];
/* a function taking a pointer to a char and an int and returning a pointer to an array of 5 pointers to int */
int *(*foo(char *, int))[5];