文章目录
缘由
2021年9月22日在刷CS:APP的时候,邂逅了一种函数指针与typedef结合的写法:typedef void (*sighandler_t)(int)
来源:CSAPP第三版
解释函数指针int (*f)(int*);
对于以下声明:
int (*f)(int*);
要从f开始往外读。 首先(*f)
表明f是一个指针;(*f)(int*)
表明f是一个指向函数的指针,这个函数以int*
作为参数。
总的来看,f是一个指针,指向一个函数,该函数的参数是 int *型, 返回值是int型。即,f被声明为一个函数指针。
这里需要注意的一点是, *f
两边的括号是必需的,否则声明变成:
int *f(int *);
它会被解读为
(int *) f(int *);
也就是说,它会被解释为一个函数原型,声明了一个函数f,它以int *
作为参数,返回值类型为int *
.
解释typedef void(*sighandler_t)(int)
理解了函数指针的声明,那么对于
typedef void(*sighandler_t)(int)
的理解就可以展开了。
这里为一个函数指针指定了别名:sighandler_t
sighandler_t 是一个函数指针,它指向这样一个函数:参数是int型,返回值是void型,即无返回值。
下面是别名的使用:
sighander_t signal(int signum, sighandler_t handler);
声明signal是一个函数,它有两个参数,其一是int型的signum,其二是sighandler_t型(函数指针型)的handler; 函数signal的返回值类型也是sighandler_t型(函数指针型)。
参考:CSAPP 第三版