Typedefs are declarations which have the keyword typedef in front and before the type. E.g.:

typedef int (*(*t0)())[5];

(you can technically put the typedef after the type too - like this int typedef (*(*t0)())[5]; but this is discouraged)

The above declarations declares an identifier for a typedef name. You can use it like this afterwards:

t0 pf;

Which will have the same effect as writing:

int (*(*pf)())[5];

As you can see the typedef name “saves” the declaration as a type to use later for other declarations. This way you can save some keystrokes. Also as declaration using typedef is still a declaration you are not limited only by the above example:

t0 (*pf1);

Is the same as:

int (*(**pf1)())[5];