在学习linux系统编程的过程中,由一个很重要的函数 signal。signal 函数的定义为:
void (* signal (int sig,void (*handler)(int)))(int);
或
typedef void (* sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);
这个函数初看起来,让人很难理解。这涉及到C语言中的函数指针。函数指针并不是指针函数,指针函数是指该函数的返回值是一个指针类型的数据,它的中心词是函数;函数指针的中心词是指针,表明函数指针是一种数据结构,该指针指向的是一个函数的入口地址。
上面第一种定义很不好理解,而且我尚未能从某个角度来很好的正确理解它的意思。最初的理解为似乎定义的是一名为 signal 的函数指针。函数指针 signal 的指向是一类参数个数为 2 :第一个参数为 int 类型的 sig ;第二个参数的类型为函数指针 handler ,它所指向的是参数数目为 1 ,类型为 int 的函数。
最后通过编写一个简单的测试小程序,才正确的理解上述定义实现的功能:![]()
上述代码运行的结果为:
分析上面的结果和代码: 函数 int (*aaa (int (*b)(int input)))(int)的传入参数 int (*b)(int input)是一个函数指针,指向 int func_name(int) 类型的函数。而语句
实现函数指针定义的三种方法:
1: 2:
3:
void (* signal (int sig,void (*handler)(int)))(int);
或
typedef void (* sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);
这个函数初看起来,让人很难理解。这涉及到C语言中的函数指针。函数指针并不是指针函数,指针函数是指该函数的返回值是一个指针类型的数据,它的中心词是函数;函数指针的中心词是指针,表明函数指针是一种数据结构,该指针指向的是一个函数的入口地址。
上面第一种定义很不好理解,而且我尚未能从某个角度来很好的正确理解它的意思。最初的理解为似乎定义的是一名为 signal 的函数指针。函数指针 signal 的指向是一类参数个数为 2 :第一个参数为 int 类型的 sig ;第二个参数的类型为函数指针 handler ,它所指向的是参数数目为 1 ,类型为 int 的函数。
最后通过编写一个简单的测试小程序,才正确的理解上述定义实现的功能:
- #include <stdio.h>
- #include <stdlib.h>
- int bbb(int input)
- {
- printf("bbb/t/t%d/n",input);
- return 0;
- }
- int ccc(int input)
- {
- printf("ccc/t/t%d/n",input);
- return 0;
- }
- int (*aaa (int (*b)(int input)))(int)
- {
- printf("aaa/n");
- b(0);
- return b;
- }
- int main(int argc,char *argv[])
- {
- int (*bb)(int input) ; /*define function pointer: bb*/
- bb=ccc; /*assign value to bb*/
- bb(1); /* run function ccc*/
- bb=aaa(ccc); /*verify return value of function aaa is function pointer*/
- bb(2);
- bb=aaa(bbb);
- bb(3);
- }
上述代码运行的结果为:
- ccc 1
- aaa
- ccc 0
- ccc 2
- aaa
- bbb 0
- bbb 3
分析上面的结果和代码: 函数 int (*aaa (int (*b)(int input)))(int)的传入参数 int (*b)(int input)是一个函数指针,指向 int func_name(int) 类型的函数。而语句
- # bb=aaa(ccc); /*verify return value of function aaa is function pointer*/
- # bb(2);
- # bb=aaa(bbb);
- # bb(3);
实现函数指针定义的三种方法:
1:
- type (*func_ptr) (参数表);
- typedef type func (参数表);
- func *func_ptr;
- typedef type(*func) (参数表);
- func func_ptr;