您的位置:首页 > 其它

C函数指针应用之回调函数

2016-10-16 22:40 246 查看
C 函数指针 应用 之 回调函数:

    回调顾名思义返回调用,一个函数(记为func1)将指向另一个函数(记为func2)的指针(记为pFunc2)作为参数(即函数指针),在func1函数体内,通过指针pFunc2返回到函数func2,完成函数func1对函数func2的调用;

 

   举例说明:(注例子来源为《Pointers On C》之高级指针话题篇):下面是一个实现在单链表中查找给定值的函数: 

         Node * search_list (Node * node , int const value){

                         

                          while (node !=NULL){

                                    if (node->value==value)

                                                  break;

                               node = node->next;

             }

                    return node;

           }

 局限性分析;该函数只能完成当链表存储的值为整型的时候的查找,而当链表的值为其他类型例如字符型的时候则无法完成,需要重新编写查找函数以适应新类型的链表;

  解决办法(及实现查找函数的代码复用):;目的是使查找函数与链表的数据类型无关; 既然与类型无关,则数据的比较方式必然要改变(因为不同类型的数据的比较方式是不同的);对于具体数据类型值的比较当然要有具体的某一种适合当前数据类型的比较方式;这是毋庸置疑的;所以对于一种特定数据类型要编写具体的比较函数;(如整型需要编写整型比较的函数,字符型要编写字符型比较的函数);

  使用函数指针当中介完成查找函数对比较函数的调用,此时将查找函数中的参数 value 改成指向value的指针,并将类型设定为void (即不确定类型),将比较函数的函数指针也作为参数传递给查找函数,这样查找函数即可实现对任何类型数据的查找,而需要具体实现的是比较函数;

 下面是使用函数指针的代码:

  

  Node * search_list (Node * node , void const*  pValue,compare){   
                     
//pValue是指向value的指针,compare 是指向比较函数的函数指针
                          while (node !=NULL){
                                    if (compare(&node->value , pValue)==0)
                                                  break;
                               node = node->next;
             }
                    return node;
           }

int 型的compare函数的实现:

  int compare(void const *a ,
void const*  pValue){

      

              if (*(int *)a == *(int *)b)  //必须先将void类型强制转换要比较的数据的数据类型;

                        return 0;

                  else 

                        return 1;

        }

这就是函数指针的应用;此例中的查找函数就被称为回调函数;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: