对void (*signal(int , void (*) (int))) (int) 理解
2017-09-21 19:56
1556 查看
signal(int
[b]signum[/b], void (*handler)(int))
signal是一个函数,有2个参数,第一个是int类型,第二个参数是一个函数指针
void (*signal(int signum, void (*handler) (int))) (int)
signal仍然是一个函数,它返回一个函数指针,这个指针指向的函数没有返回值,只有一个int类型的参数
可以用typedef简化:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
此处由于加了typedef自定义了一个新类型sighandler_t,所以第二行的函数原型看起来顺眼多了,形式跟int func(char c, int i)无异,但是如果看不懂typedef语句,这两句话仍然是噩梦。
要理解typedef,只要记住一句话就差不多了,那就是:typedef在语句中所起的作用只不过是把语句原先定义变量的功能变成了定义类型的功能而已。我们只消看几个例子立即明白。
例如语句 typedef int *apple; 理解它的正确步骤是这样的:先别看typedef,就剩下int *apple; 这个语句再简单不过,就是声明了一个指向整型变量的指针apple (注意:定义只是一种特殊的声明),加上typedef之后就解释成声明了一种指向整型变量指针的类型apple 。
现在,回过来看上面的这个函数原型 typedef void (*sighandler_t)(int),盖住 typedef不看 ,再简单不过,sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针 。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针,这种指针指向的函数接受一个整型参数并返回一个无类型指针 。怎么样?简单吧。
再来做一个更酷的练习,请看:typedef char *(* c[10])(int **p);
aa87
去 掉typedef就变成char *(* c[10])(int **p),先不管这个语句有多难看,它一定是声明了一个拥有10个元素的数组c对不对?okay没什么了不起的,只不过这个数组c的元素有点特别,它们都 是函数指针,并且它们所指向的这些函数统统都接受一个二级指针然后返回一直指向字符型的指针。加上typedef之后,c就不是一个数组了,而是一种类型 了 。
下面是一个例子:
#include<iostream>
#include<signal.h>
using namespace std;
void (*signal(int,void(*)(int)))(int);
void func(int b)
{
cout << "抓到你了" << b << "\n";
}
int main()
{
void (*pf)(int);
pf = signal(10,func);
pf(10);
}
void (*signal(int a ,void(*pa)(int b)))(int c){
pa(a);
return func;
}
输出:
抓到你了10
抓到你了10
[b]signum[/b], void (*handler)(int))
signal是一个函数,有2个参数,第一个是int类型,第二个参数是一个函数指针
void (*signal(int signum, void (*handler) (int))) (int)
signal仍然是一个函数,它返回一个函数指针,这个指针指向的函数没有返回值,只有一个int类型的参数
可以用typedef简化:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
此处由于加了typedef自定义了一个新类型sighandler_t,所以第二行的函数原型看起来顺眼多了,形式跟int func(char c, int i)无异,但是如果看不懂typedef语句,这两句话仍然是噩梦。
要理解typedef,只要记住一句话就差不多了,那就是:typedef在语句中所起的作用只不过是把语句原先定义变量的功能变成了定义类型的功能而已。我们只消看几个例子立即明白。
例如语句 typedef int *apple; 理解它的正确步骤是这样的:先别看typedef,就剩下int *apple; 这个语句再简单不过,就是声明了一个指向整型变量的指针apple (注意:定义只是一种特殊的声明),加上typedef之后就解释成声明了一种指向整型变量指针的类型apple 。
现在,回过来看上面的这个函数原型 typedef void (*sighandler_t)(int),盖住 typedef不看 ,再简单不过,sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针 。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针,这种指针指向的函数接受一个整型参数并返回一个无类型指针 。怎么样?简单吧。
再来做一个更酷的练习,请看:typedef char *(* c[10])(int **p);
aa87
去 掉typedef就变成char *(* c[10])(int **p),先不管这个语句有多难看,它一定是声明了一个拥有10个元素的数组c对不对?okay没什么了不起的,只不过这个数组c的元素有点特别,它们都 是函数指针,并且它们所指向的这些函数统统都接受一个二级指针然后返回一直指向字符型的指针。加上typedef之后,c就不是一个数组了,而是一种类型 了 。
下面是一个例子:
#include<iostream>
#include<signal.h>
using namespace std;
void (*signal(int,void(*)(int)))(int);
void func(int b)
{
cout << "抓到你了" << b << "\n";
}
int main()
{
void (*pf)(int);
pf = signal(10,func);
pf(10);
}
void (*signal(int a ,void(*pa)(int b)))(int c){
pa(a);
return func;
}
输出:
抓到你了10
抓到你了10
相关文章推荐
- void (*signal(int signo, void (*func) (int))) (int) 理解
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
- void (*signal(int sig, void (*func) (int))) (int)理解
- void (*signal(int sig, void (*func) (int))) (int)理解
- 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
- void (*signal(int sig, void (*func) (int))) (int)理解
- 理解(*(void(*)())0)()和void (*signal(int, void(*)(int)))(int)
- 关于c语言声明 void (*signal(int sig, void(*func)(int)))(int)的理解
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
- 关于typedef void (*sighandler_t)(int)的理解
- error: initializing argument 2 of 'void (* signal(int, void (*)(int)))(int)'
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
- typedef int (*init_fnc_t)(void);的理解
- void (*signal(int signo, void (*fun(int))))(int)
- signal函数:void (*signal(int,void(*)(int)))(int);
- 关于typedef int (init_fnc_t) (void);理解
- typedef int (*ONMENU) (void) 的理解
- C专家编程—分析signal函数的原型声明{void (*signal(int sig,void (*func)(int)))(int)}(2)