关于函数声明,如int f(char c),我以前一直以为左边的int代表函数返回类型,即输入参数是char c,返回一个int型的变量。现在才知道这都是误解,正解是,函数返回值为f(char c),被int定义,使得f(char c)为int型,正如同int a声明a为int型一样。
你说两种对声明的理解都可以,但是在复杂声明中就可以看出差别了。
举几个例子(选自《Linux C 一站式编程》22.9节):
1. typedef void (*sighandler_t)(int);
sighandler_t singal(int signum, sighandler_t handler);
如果把这两行合并成一行,就是:
void (*signal(int signum, void (*handler)(int)))(int);
通过这个例子我们可以分析出,typedef做的工作就是将sighandler_t后面的***带入sighandler_t中。
2. int (*(*fp)(void *))[10];
首先把外面的int (*)[10]剥开,里面是(*fp)(void *),即一个函数地址fp,输入为void *,输出是一个10个整型的数组的地址。
3. char (*(*x(void))[3])(void);
先把外面的char (*)(void)剥开,里面是(*x(void))[3],注意这里*是与数组结合还是与函数结合?因为x先与(void)结合再与*结合,故为x(void)返回的是(*)[3],即为3个成员的数组的地址,如果为函数的地址应为(*x)(void)。3个成员的数组每个成员是什么类型呢?是char (*)(void)型函数的地址。