回调函数的理解

回调函数的理解


前言:

         刚开始用C语言听说过回调函数,但没有仔细去理解,随着工作的慢慢积累,逐步的用到了回调函数,本人认为,“回调函数”的理解对于很多人是一个槛,要想跨过,就得理解清楚,还得会用。这里就用本人的方式讲解一下回调函数如何理解。
 



第一步:通俗的解释“回调函数”

一、回调就是一种利用函数指针进行函数调用的过程。
二、你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。
三、回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。
注:以上解释均摘自网络,感谢这些大佬的解释。


 

或许到这里你已经明白了那么个意思,但是问题来了:
1.      怎么看出来就是一个回调函数呢?
2.      怎么定义一个回调函数呢?
3.      怎么使用回调函数呢?
带着问题我们看实例,然后再解释。



第二步:实例解释

  1. #include "stdio.h"
  2. int sub(int a, int b)//求和函数
  3. {
  4.     return a+b;
  5. }
  6. int mul(int a, int b)//求积函数
  7. {
  8.     return a*b;
  9. }
  10. int test(int(*p)(int,int), int a, int b)//测试函数
  11. {
  12.     return (*p)(a, b);
  13. }
  14. void main(void)
  15. {
  16.     int a = 8;
  17.     int b = 2;
  18.     int temp;
  19.     temp = test(sub, a, b);
  20.     printf("%d\n",temp);
  21.     temp = test(sub, a, b);
  22.     printf("%d\n",temp);
  23. }
  24. 执行结果就是
  25. 10     //8+2
  26. 16     //8*2
复制代码
主要分析这个test函数,它的三个输入参数分别是
int(*p)(int, int)         int a          int b

 

后面两个好理解,就是跟常见的一样,是一个函数的两个输入参数。
 
第一个要怎么理解呢?
 
首先看到有*p,这是一个指针了,类比到int *a这种定义方式来理解。
Int temp; //定义一个int型的变量,名称是temp
Int  *a;//定义一个 名称为a的指针这个指针限定的范围是“int型变量”

 

 
那么int(*p)(int, int)它的意思是:定义一个名称为p的函数指针, p指向的函数要求有两个int输入参数,而且要求这个函数返回值是int

 

那么趁热打铁void(*p)(int, int)的意思就是:定义一个名称为p的函数指针, p指向的函数要求有两个int输入参数,而且要求这个函数返回值是void型(即没有)。

 

void(*p)(int)的意思就是:定义一个名称为p的函数指针, p指向的函数要求有一个int输入参数,而且要求这个函数返回值是void型(即没有)。
char(*p)(int)的意思就是:定义一个名称为p的函数指针, p指向的函数要求有一个int输入参数,而且要求这个函数返回值是char型。

 

 
那么现在有没有明白这个参数的定义呢?
有篇资料中有这么一段
『函数指针的定义比较怪,为什么不是 void ()(int, int, float) *p_func
而是 void(*p_func)(int, int, float) 这种形式?』
这个问题我也不知道,也没必要纠结,花点时间理解下它与普通指针的区别,记住这就是它的定义形式。

 

 
到这里:总结一下,上面的这么多都是在解释一个“函数指针”。理解了函数指针,我们再看一下
int test(int(*p)(int,int), int a, int b)//测试函数
{
    return (*p)(a, b);
}

 

这个test函数是把 p 这个函数指针作为一个输入参数。

 

temp = test(sub, a, b);
这一句呢,就是把p指向sub这个函数, Sub要求有两个int输入参数。

 

Return (*p)(a,b);就是
Return sub(a,b);这里 *p这个参数起作用了,这个参数就是sub函数,就是一个算法。





第三步:疑问解惑

现在来回答第一步的三个问题了:
 
1、  怎么看出来就是一个回调函数呢?
像test函数那样,用了函数指针作为输入参数的函数就是回调函数,这种函数会调用另外一个函数作为输入参数。


 

2、  怎么定义一个回调函数呢?
回调函数定义跟上面的识别是反过来的,定义一个函数,它的输入参数中有函数指针,那么你就定义了一个回调函数。


 

3、  怎么使用回调函数呢?
使用回调函数的地方有很多,一般用于封装的程序给开发人员留出后期开发接口。
  1. int test(int(*p)(int,int), inta, int b)
  2. {
  3.           Int temp;
  4.            temp = (*p)(a, b);
  5.           if(temp != 0)
  6.                    return OK;
  7.           else
  8.                    return FAIL;
  9. }
复制代码
这样修改test函数,然后封装起来,test函数只做结果是否不为0的判断,后期开发人员可以把计算函数指针,和参与计算的两个参数输入给test,test就能返回OK或者FAIL。虽然这个test函数已经固定了,但后期开发人员依然可以随便更改计算函数。

 

回调函数是将一个方法作为参数传递给另一个方法的技术。在C#中,回调函数可以用来实现底层数据接收的回调、订单支付的回调等等。以下是两个示例来帮助理解回调函数在C#中的使用: 示例1: ```csharp namespace CallBackFunction { class Program { static void Main(string[] args) { Program prog = new Program(); SumClass sc = new SumClass(); int result = sc.SetCallBack(prog.GetSum); Console.WriteLine(result.ToString()); } private int GetSum(int a, int b) { return (a + b); } } class SumClass { public delegate int Sum(int num1, int num2); public Sum OnSum = null; public void SetCallBack(Sum Parameter) { this.OnSum = Parameter; } private void CallBackFunction(int num1, int num2) { if (OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } private void CallBackFunction(int num1, int num2) { if(OnSum != null) { OnSum(num1, num2); } } } } ``` 示例2: ```csharp namespace CallBackFunction { class Program { static void Main(string[] args) { Program prog = new Program(); SumClass sc = new SumClass(); int result = sc.SumAll(prog.GetSum); Console.WriteLine(result.ToString()); } private int GetSum(int a, int b) { return (a + b); } } class SumClass { public delegate int Sum(int num1, int num2); public int SumAll(Sum sum) { //可以进行其他操作 return sum(1, 2); } } } ``` 在这两个示例中,我们可以看到回调函数的使用。在第一个示例中,通过将`GetSum`方法作为参数传递给`SetCallBack`方法来设置回调函数。在第二个示例中,通过将`GetSum`方法作为参数传递给`SumAll`方法来实现回调函数。这样,当回调函数被调用时,传递的方法将被执行并返回相应的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C# 回调函数个人理解和简单示例](https://blog.csdn.net/BYH371256/article/details/130658624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值