c++指针函数的使用——回调函数

时间:2023-01-17 20:21:30
 /*

 函数指针

     函数也是有地址的

     所谓函数指针,就是指向函数的指针,函数指针也是一个变量,可以指向不同的函数。同时通过函数指针可以调用其指向函数,从而使函数的调用更加灵活。

 函数指针的用途

 */

 #include<iostream>
 using namespace std;
 int add(int x, int y);
 int add(int x, int y)
 {
     return x + y;
 }
 int main()
 {
     //cout << &add;//将函数add的地址输出

     //定义函数指针
     int(*pf)(int x, int y);
     //函数指针名*pf两侧的括号不能省略,否则就成了一个返回“int *”类型的函数声明。
     //正是括号使得“*”和标识符“pf”组成一个整体,表示pf是一个指针

     pf=add;//pf=&add;给函数指针赋值

     //int x = pf(3, 4);//通过函数指针pf调用函数add  (使用函数指针不必像使用一般指针那样解引用)
     , );//函数指针解引用 这样做的好处可以明确指明pf是一个函数指针,否则只有看到定义才能分辨出pf是一个函数还是一个指针函数

     cout << x << endl;

     typedef int(*FUN_PTR)(int a, int b);
     //有时候函数的参数列表和返回类型比较复杂,每次定义这样的函数指针都要重写一遍比较繁琐。因此可以用类型定义运算符typedef为该函数定义一个简单的类型名。
     //有了这样一个类型名之后就可以用来定义函数指针变量,而不用重写函数的参数列表和返回类型
     FUN_PTR fun_ptr = add;
     //虽然相对于定义函数指针变量,定义函数指针类型只是多了一个关键字。但也正因为如此,FUN_FTR也不再是一个变量,而变成了一个类型。同普通指针一样,如果
     //没有明确的初始化,则函数指针的值将是一个随机数,使用这样的指针非常危险。因此在使用函数指针之前对其进行初始化或着赋一个初值,即将一个函数名赋给
     //该函数指针变量
     cout << fun_ptr(, )<<endl;

     system("pause");
     ;
 }
 /*

 指针函数的使用——回调函数

 */
 #include<cstdlib>
 #include<iostream>
 using namespace std;

 typedef bool(*FUN_PTR)(int a, int b);//定义函数指针类型

 /*
  * 排序函数
  * 参数:数组,数组的长度,指针函数(不同的排序方式)
  * 返回:排序好的数组
  */
 void sort(int ary[], int n, FUN_PTR pf);
 void sort(int ary[], int n, FUN_PTR pf)
 {
     ; i < n - ; i++)//遍历第1个到n-1个元素
     {
         int val = ary[i];
         ; j < n; j++)//遍历当前元素之后的所有元素
         {
             if (pf(val, ary[j]))//调用回调函数
             {
                 val = ary[j];
                 ary[j] = ary[i];
                 ary[i] = val;
             }
         }
     }
 }
 bool my_less(int a, int b);//比较两个参数的大小
 bool my_less(int a, int b)
 {
     return a < b;
 }

 bool my_big(int a, int b);//比较两个参数的大小
 bool my_big(int a, int b)
 {
     return a > b;
 }
 int main()
 {
     cout << "----------使用函数指针确定排序标准-----------";
     ] = {,,,,,,};
     sort(ary, , my_big);//sort(ary,3,&my_less);//sort(ary,3,big);
     ; i < ; i++)
     {
         cout << ary[i] << " ";
     }
     cout << endl;
     system("pause");
     ;
 }

c++指针函数的使用——回调函数的更多相关文章

  1. C&plus;&plus;-函数与指针的关系(回调函数)

    1.函数类型 C语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 ★ int add(int i, int j)的类型为int(int, int) C语言中通过typede ...

  2. JS中的匿名函数、回调函数、匿名回调函数

    工欲善其事必先利其器 在学习JavaScript设计模式一书时,遇到了“匿名回调函数”这个概念,有点疑惑,查找了些资料重新看了下函数的相关知识点之后,对这个概念有了认识.九层之台,起于垒土.在熟悉这一 ...

  3. mongoose的update函数中的回调函数是必须要传的吗

    mongoose中的update的回调函数是必须要传的,如果不传,则不会更新. 例如这样写是不会更新的 tagModel.update({name:tagName},{$inc:{total:1}}, ...

  4. &dollar;&period;ajax&lpar;&lbrace; &rcub;&rpar; 里面的success函数不执行 &vert; 回调函数返回的值 用对象,下标,键值对访问不到时

    原因一般是  dataType:'json' 数据类型设置成了json  ,去掉这个设置即可 $.ajax({ }) 回调函数返回的值 用对象,下标,键值对访问不到时,考虑是否返回数据为字符串 考虑是 ...

  5. LUA使用虚函数与使用回调函数

    ------------------虚函数overload-------------------------- --回调:寻路中格子坐标改变 CHero.OnSearchToCellsChange = ...

  6. 在Java中如何编写回调函数,以及回调函数的简单应用

    import static java.lang.System.out; import static java.lang.System.err; import java.util.logging.Lev ...

  7. Promise对象的resolve回调函数和reject回调函数使用

    Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是 ...

  8. js for 循环中有异步函数时,回调函数总是最后一步的值。

    原因:for循环执行时不会等待异步函数执行. 解决方法: 1.改为递归函数(暂时不会). 2.构建一个自执行函数传参(匿名函数) 参考::https://www.cnblogs.com/csuwuji ...

  9. C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

随机推荐

  1. python的一道面试题 &lowbar;&lowbar;call&lowbar;&lowbar; 的使用&period;

    class Person: def __init__(self): self.age = 1 def __call__(self, *args, **kwargs): print 'age', sel ...

  2. mybatis 聚合查询

    <resultMap id="ExtResultMap" type="com.demo.partner.po.PartnerPO"> <id ...

  3. MongoDB下载安装

    MongoDB官方下载地址:http://www.mongodb.org/ 一.在Windows平台下的安装 1.下载MongoDB数据库 2.设置MongoDB程序存放目录 下载完数据库后,直接解压 ...

  4. 23讲 URL

    这是看完23讲后的小笔记,关于URL规则.伪静态. 一.URL规则 2.此处的区分大小写,也只是对第一个字母区分,并非对整个模块名. 3.模块名复杂时,且区分大小写,此时在地址栏访问时要用" ...

  5. Tomcat部署多个项目及相关配置

    1.配置多个项目 在tomcat的conf目录下,找到server.xml,在其中添加<Host>节点即可进行多个项目的部署 <Host name="localhost&q ...

  6. java小入门的感觉

    工作两三年,.NET与Java都干过,也都是应付差事,用着现有的框架,现有的规范,实现简单的功能,有余力的情况下,看看框架中的代码,欣赏一下前辈们的心血,居然在单位也算有心的了?! 最近的JAVA项目 ...

  7. UEP-自定义持久化类

    HY-UEP提供了两种持久化方式:基于JPA的持久化机制和自定义持久化机制,JPA的持久化机制 比较符合现在的软件开发模式,支持各种主流数据库;自定义持久化时我们平台产品的特有持久化 机制的升级,在综 ...

  8. pt-online-schema-change的实现原理

    pt-online-schema-change用于MySQL的在线DDL. 下面结合官方文档和general log来分析其实现原理. 测试表 mysql> show create table ...

  9. Android 标题栏(1)

    本文来自网易云社区 作者:孙有军 标题栏在每个应用中都有,有各种各样的标题栏,今天我们就主要来说说标题栏怎么做,主要内容涉及到自定义标题,ActionBar,Toolbar等知识. 自定义标题 几年前 ...

  10. 【bzoj5084】 hashit(广义SAM&plus;set)

    题面 传送门 题解 后缀平衡树是个啥啊我不会啊-- 那么我们来考虑一下\(SAM\)的做法好了 不难发现它的本义是要我们维护一棵\(trie\)树,并求出\(trie\)树上每一个节点到根的这段串的不 ...