C语言学习第26篇---函数与指针分析 回调函数

举报
CodeAllen 发表于 2021/10/30 01:06:35 2021/10/30
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取   函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定     int add(int i,int...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取

 

函数类型的概念

1.C语言函数也是有类型的

2.函数类型由函数返回值,参数类型,参数个数共同决定

    int add(int i,int j)  的类型是    int(int , int)

3.C语言中通过typedef为函数重命名

    typedef type name(parameter list)

 

例:       

 typedef int f(int , int);

  typedef void p(int);

 

 

引出一个问题:为什么要定义函数指针,直接使用函数名不是挺好的?

如何使用C语言直接跳转到某个固定地址开始执行?(面试题)

根据以下实验,当然可以,根据函数指针就可以

 

实例1:函数指针的使用


  
  1. #include <stdio.h>
  2. typedef int(FUNC)(int); //定义函数类型
  3. int test(int i)
  4. {
  5. return i * i;
  6. }
  7. void f()
  8. {
  9. printf("Call f()...\n");
  10. }
  11. int main()
  12. {
  13. FUNC* pt = test; //就是int型,直接使用test函数进行初始化,是合法的,相当于使用函数的入口地址
  14. void(*pf)() = &f; //函数跟数组不同的是,取不取地址都是入口地址
  15. printf("pf = %p\n", pf);
  16. printf("f = %p\n", f);
  17. printf("&f = %p\n", &f);
  18. pf(); //直接使用函数
  19. (*pf)(); //取地址,其实是等价于f();
  20. printf("Function pointer call: %d\n", pt(2));
  21. return 0;
  22. }

 

回调函数

1.回调函数是利用函数指针实现的一种调用机制

2.回调机制原理

  •    -调用者不知道具体时间发生时需要调用的具体函数
  •    -被调函数不知道何时被调用,只知道需要完成的任务
  •    -当具体事件发生时,调用者通过函数指针调用具体函数

3.回调机制中的调用者和被调用函数互不依赖

 

实验2:


  
  1. #include <stdio.h>
  2. typedef int(*Weapon)(int);
  3. void fight(Weapon wp, int arg)
  4. {
  5. int result = 0;
  6. printf("Fight boss!\n");
  7. result = wp(arg);
  8. printf("Boss loss: %d\n", result);
  9. }
  10. int knife(int n)
  11. {
  12. int ret = 0;
  13. int i = 0;
  14. for(i=0; i<n; i++)
  15. {
  16. printf("Knife attack: %d\n", 1);
  17. ret++;
  18. }
  19. return ret;
  20. }
  21. int sword(int n)
  22. {
  23. int ret = 0;
  24. int i = 0;
  25. for(i=0; i<n; i++)
  26. {
  27. printf("Sword attack: %d\n", 5);
  28. ret += 5;
  29. }
  30. return ret;
  31. }
  32. int gun(int n)
  33. {
  34. int ret = 0;
  35. int i = 0;
  36. for(i=0; i<n; i++)
  37. {
  38. printf("Gun attack: %d\n", 10);
  39. ret += 10;
  40. }
  41. return ret;
  42. }
  43. int main()
  44. {
  45. fight(knife, 3);
  46. fight(sword, 4);
  47. fight(gun, 5);
  48. return 0;
  49. }

 

 

小结: 

1.C语言中的函数都有特定的类型

2.可以使用类型的定义函数指针

3.函数指针是实现回调函数机制的关键技术

4.通过函数指针可以在C程序中实现固定的地址跳转

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/89112306

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。