当前位置: 首页 > article >正文

回调函数_回顾

函数指针和回调函数

函数指针是指向函数的指针变量。

通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。

函数指针可以像一般函数一样,用于调用函数、传递参数。

直接用指针表示函数,而不是*指针,看下面的长例子

函数指针变量的声明:

typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

以下实例声明了函数指针变量 p,指向函数 max:

#include <stdio.h>
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); //好奇怪,直接用指针表示函数
 
    printf("最大的数字是: %d\n", d);
 
    return 0;
}
/*
请输入三个数字:1 2 3
最大的数字是: 3
*/

回调函数,先设置一个函数地址作为参数(目前还不知道这个函数具体长什么样子),之后再把具体的函数传进去

实例

实例中 populate_array() 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。

实例中我们定义了回调函数 getNextRandomValue(),它返回一个随机值,它作为一个函数指针传递给 populate_array() 函数。

populate_array() 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。

#include <stdlib.h>  
#include <stdio.h>
 
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) //这里的参数是一个函数(无参函数)指针(目前还不知道函数具体是啥)
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}
 
// 获取随机值
int getNextRandomValue(void)
{
    return rand();
}
 
int main(void)
{
    int myarray[10];
    /* getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/
    populate_array(myarray, 10, getNextRandomValue);
    //这里原本是int (*getNextValue)(void)参数的地方传递了一个函数getNextRandomValue,也就是说int (*getNextValue)(void)=getNextRandomValue,满足函数指针的定义,也就是函数指针已经定义完成了,对于populate_array,看他的定义体,array[i] = getNextValue();,此时的getNextValue()就替换成了getNextRandomValue(因为上个例子也展示了,getNextRandomValue是一个指针,直接当函数用,不需要括号)
    for(int i = 0; i < 10; i++) {
        printf("%d ", myarray[i]);
    }
    printf("\n");
    return 0;
}

/*
输出结果
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709
*/

http://www.kler.cn/a/18398.html

相关文章:

  • 中兴光猫修改SN,MAC,修改地区,异地注册,改桥接,路由拨号
  • 华为:hcia综合实验
  • 微信小程序自定义tabbar;禁用某个tab;修改某个tab的样式
  • MySQL数据库:本地部署数据库以及安装彩虹猫【Navicat】
  • ReactPress 安装指南:从 MySQL 安装到项目启动
  • 怎么禁止Ubuntu自动更新升级
  • 远程桌面连接出现了内部错误怎么解决?
  • 20230506在Ubuntu22.04下使用python3下载合并ts切片
  • FTP Entering Extended Passive Mode
  • 为什么越来越多的设计师开始用云渲染来渲图?
  • 关于maven
  • Hive为什么要分桶?
  • 【数据结构】Treap树堆
  • django:django2配置websocket
  • 删除的文件怎样恢复?实用的方法
  • TomcatServletHTTP
  • 【Linux】项目自动化构建工具 —— make/Makefile
  • 【Java|golang】1419. 数青蛙
  • 操作系统第二章——进程与线程(中)
  • SpringCloud_Config配置中心和Bus消息总线和Stream消息驱动
  • 远程桌面连接是什么?如何开启远程桌面连接详细教程
  • 不用花一分钱!!!获得一个自己的网页版chatGPT
  • 【前端面试题】深拷贝的终极实现
  • Mysql 中left join时 on、and、where区别
  • Redis高可用系列——Set类型底层详解
  • 云计算实战应用案例精讲-【深度学习】多模态融合情感分析(论文篇二)