Let's decompose the declarations:
int f(int);
declares f as a function taking an int and returning an int.
This can be written with parentheses (this is useless here but harmless):
int (f)(int);
The following declaration:
int *f(int);
declares f as a function taking an int and returning a pointer to an int.
This time, parentheses change the order of evaluation:
int (*f)(int);
declares f as a pointer to a function taking an int and returning an int.
typedef is used to define a type instead of a variable.
Finally the sequence:
typedef int (*f)(int);
f a[7];
declares a as an array of seven elements of type f, f describing a pointer to a function taking an int and returning an int.
By the way, there is a converter for that sort of things: cdecl: C gibberish ↔ English.
typedef-ed.typedef int t_build(t_cmds*, t_table*); t_build *builtin[7];.