int *f();
首先执行函数调用操作符(),它的优先级高于间接访问操作符,因此 f 是一个函数,它的返回值类型是一个指向整型的指针。
int (*f)();
第2对括号是函数调用操作符,但第1对括号只起到聚组的作用。它迫使间接访问在函数调用之前进行,使 f 成为一个函数指针,它所指向的函数返回一个整型值。
int *(*f)();
f 也是一个函数指针,只是它所指向的函数的返回值是一个整型指针,必须对其进行间接访问操作才能得到一个整型值。
int f[];
这个声明表示 f 是一个整型数组。
int *f[];
下标的优先级更高,所以 f 是一个数组,它的元素类型是指向整型的指针。
int (*f[])();
括号内的表达式 f[] 首先进行求值,所以 f 是一个元素为某种类型的指针的数组。表达式末尾的 () 是函数调用操作符,所以 f 肯定是一个数组*,数组元素的类型是函数指针,它所指向的函数的返回值是一个整型值。
int *(*f[])();