函数指针

本文深入探讨了Linux系统中signal函数的定义与使用方法,并通过一个示例程序详细解释了函数指针的概念及其在signal函数中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在学习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 的函数。
   最后通过编写一个简单的测试小程序,才正确的理解上述定义实现的功能:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int bbb(int input)
  4. {
  5.     printf("bbb/t/t%d/n",input);
  6.     return 0;
  7. }
  8. int ccc(int input)
  9. {
  10.    printf("ccc/t/t%d/n",input);
  11.    return 0;
  12. }
  13. int (*aaa (int (*b)(int input)))(int
  14. {
  15.     printf("aaa/n");
  16.     b(0);           
  17.     return b;                            
  18. }
  19. int main(int argc,char *argv[])
  20. {
  21.     int (*bb)(int input) ;  /*define function pointer: bb*/
  22.     bb=ccc;         /*assign value to bb*/
  23.     bb(1);          /* run function ccc*/
  24.     bb=aaa(ccc);        /*verify return value of function aaa is function pointer*/
  25.     bb(2);
  26.     bb=aaa(bbb);
  27.     bb(3);
  28. }

上述代码运行的结果为:
  1. ccc             1
  2. aaa
  3. ccc             0
  4. ccc             2
  5. aaa
  6. bbb             0
  7. bbb             3

分析上面的结果和代码: 函数 int (*aaa (int (*b)(int input)))(int)的传入参数 int (*b)(int input)是一个函数指针,指向 int func_name(int) 类型的函数。而语句
    1. #     bb=aaa(ccc);        /*verify return value of function aaa is function pointer*/
    2. #     bb(2);
    3. #     bb=aaa(bbb);
    4. #     bb(3);
运行的结果表明函数 aaa 的返回值是一个函数指针,这个指针同样指向 int func_name(int) 类型的函数。

实现函数指针定义的三种方法:
1:
  1. type (*func_ptr) (参数表);
2: 
  1. typedef type func (参数表);
  2. func *func_ptr;
3:                    
  1. typedef type(*func) (参数表);
  2. func func_ptr;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值