函数指针与回调函数

来源:互联网 发布:淘宝泄露买家信息处罚 编辑:程序博客网 时间:2024/06/04 18:19

函数指针与回调函数

大家好,今天带给大家的是函数指针与回调函数。这篇文章也许你随眼飘过感觉没什么用,但是当你以后查找类似资料的时候,没有看见这篇菜菜写的文章就默默后悔吧。

在很多很好的代码注释中指名使用了回调函数,但是这么高深的东西很难让我们这些菜鸟们懂。于是乎,小殇翻看了很多很多云里雾里的东西,弄点最简单易懂的带给大家。

先讲函数指针(指针函数是返回值指针的函数,不一样哦),指针大家都接触过,指向变量,数组,字符,函数指针当然就是指向函数了。来一段百度百科的例子:


#include<stdio.h>int max(int x,int y){ return(x>y?x:y); }int main(){    int (*ptr)(int, int);    int a,b,c;    ptr=max;    scanf("%d%d",&a,&b);    c=(*ptr)(a,b);    printf("a=%d,b=%d,max=%d",a,b,c);}

上述例子很简单啦,就是先定义一个max函数,然后在主函数中声明一个函数指针,由于ptr代表函数的首地址,因此ptr=max后,指针ptr就指向max函数的首地址。自然就可以进行调用了。(PS:这里的指针不要乱++和--哈。数组指针知道下一个是什么,你函数指针知道麽?)
函数指针只是回调函数的基础,让小殇带领大家来说说回调函数。先来看官方解释:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
我不知道大家怎么理解的,至少我看了好多文章真的是迷茫惘然了一阵,因为说的很多就不一样,完全没看懂回调是什么。比如下面是某博客写的一个最简单的回调函数。很多博客有类似的简单代码,其实我不想说下面代码中有多么误导读者了,因为下面代码那么多perfect,大家表明看懂了,实际懂毛了。
#include<stdio.h>#include<stdlib.h>void perfect(int n){ int i=1;    int count=0; for(i=1;i<n;i++) {       if(0==n%i)  {   count+=i;  } } if(count==n)  printf("%d是完数\n",n); else printf("%d不是完数\n",n);}void myCallback(void (*perfect)(int ),int n){ perfect(n);}int main(){ int n; printf("请输入一个正整数\n"); scanf("%d",&n); myCallback(perfect,n); return 0;}

为了让大家看懂点很多博文列举的大概意思,我自己写了个类似的代码。就是下面的代码啦。(当然这依旧不是我心目中的回调函数。当然,这是一些博文没表达清楚的意思。)下面的代码主函数里注册了回调函数callback(521, miss1)及  callback(125, miss2),当然调用了函数callback(int times, void (* name)(int))执行,其中miss1和miss2就是函数指针,通过变成name()的方式相信大家一眼就懂了,name也是指针,调用这个函数时name指针就指向miss1的地方,然后就调用miss1函数。这个函数是解释清楚了,但是我认为这不是真正的回调函数,因为这是实现方直接调用的,而不是在特定的事件或条件发生时由另外的一方调用的。
#include <stdio.h>#include <iostream>using namespace std;void miss1(int len){       printf("I miss you。%d \n", len);}void miss2(int len){       printf("Do you miss me?125\n", len);}void callback(int times, void (* name)(int)){      name(times); }int main(void){       callback(521, miss1);       callback(125, miss2);   system("pause");}


笔者认为的回调函数是这样的(虽然木有给出代码,而且仅为个人观点,但是最终解释权归笔者哈),系统需要调用函数,但是需要不知道用户哪种需求啊,所以类似接口的意思,提前注册好了函数,类似callback(*name),然后当系统执行到某一程度了,就会调用name();函数,但是这个name函数是什么,系统也不知道啊,所以,交给你去处理了。然后用户就可以在这个时候进行一系列处理。类似中断的意思,我的API函数遇到某种情况就中断,比如某种时钟函数,每一分钟我中断一次,你用户有什么事情调用你的函数处理吧。也就类似消息通知函数,比如我系统到某个程度(用户看资料应该知道发生什么了),就通知你下,然后你处理消息吧,该干什么干什么,处理完了系统继续干。
好吧,满篇的大白话,果断没有专业术语,因为专业术语太高端,一点也不接地气,我们要走的是群众路线哈。
在此发句牢骚,特别无奈那些拿着网上资料到处复制来复制去骗积分之类的,因为你首先不知道来源的正确性,有时候漫天的错误很容易误导菜菜的,其次那么多雷同的网站往往让人很难找到新的信息看法,比如这篇文章就可能会淹没在无数雷同的类似文章中。支持原创,却不支持漫天复制赚积分。(今天还碰到恶毒的,把一个在相关资料上很常见的代码分成几个文件发到pudn上,真的太太太无耻了!)
吼吼,自己的第二篇博客,原创哦,消耗了大量珍稀时间,希望大家能够喜欢,希望能帮助到有用的人。
0 0
原创粉丝点击