首页 > 其他分享 >C函数指针和回调函数

C函数指针和回调函数

时间:2022-10-20 17:04:34浏览次数:75  
标签:函数 int max 函数指针 回调 array

函数指针

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

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

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

函数指针变量的声明:

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

实例

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

 1 #include <stdio.h>
 2  
 3 int max(int x, int y)
 4 {
 5     return x > y ? x : y;
 6 }
 7  
 8 int main(void)
 9 {
10     /* p 是函数指针 */
11     int (* p)(int, int) = & max; // &可以省略
12     int a, b, c, d;
13  
14     printf("请输入三个数字:");
15     scanf("%d %d %d", & a, & b, & c);
16  
17     /* 与直接调用函数等价,d = max(max(a, b), c) */
18     d = p(p(a, b), c); 
19  
20     printf("最大的数字是: %d\n", d);
21  
22     return 0;
23 }

编译执行,输出结果如下:

请输入三个数字: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);
    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


查看:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html

标签:函数,int,max,函数指针,回调,array
From: https://www.cnblogs.com/wxdlut/p/16810476.html

相关文章

  • 26 数组作为函数参数
    01数组元素作为函数实参数组元素可以用作函数实参,不能用作形参。在用数组元素作函数实参时,把实参的值传给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递......
  • python 常用的字符串处理函数
    find()  功能:检测字符串是否包含特定字符,如果包含,则返回开始的索引;否则返回-1##find()函数str='helloworld'#'wo'在字符串中print(str.find('wo'))#'wc'......
  • 第六章 函数
    实例01代码如下:deffunction_tips():'''功能:每天输出一条励志文字'''importdatetime#导入日期时间类#定义一个列表mot......
  • Python实验报告——第6章 函数
    实验报告实例01:输出每日一帖(共享版)代码如下:deffunction_tips():'''功能:每天输出一条励志文字'''importdatetime#导入日期时间类#定义......
  • python实验报告(函数)
    1.输出每日一站(共享版)  结果:   2.根据身高,体重计算BMI指数  结果:  3.根据身高,体重计算BMI指数  结果:  4.模拟结账功能———计算实付金......
  • Linux shell 常用函数
    *以下函数或文件,在某些发行版本系统不支持,请先测试确认是否可用。 ####  生成连续的数字  ####  方式一: [1]正序:{1..16}倒序:{16..1}示例:forni......
  • 第六章 函数
    一.输出每日一贴1, 代码:deffunction_tips():   '''功能:每天输出一条励志文字   '''   importdatetime            #导入日期时间类  ......
  • php根据字符串取得 数字月份函数 php字符串和日期时间转换函数汇总
    <?php$time="2011-1-114:07:14";//字符串类型的日期,很多路径都获取到,如数据库//把字符串类型的日期转换一个时间戳echodate('n',strtotime($time));//1......
  • Javascript--变量内函数句柄
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>菜鸟教程(runoob.com)</title></head><body><p>创建和使用对象方法。</p><p>对象方法作为一个函数定义存储......
  • mysql函数 字符长度限制_MySQL中使用group_concat()函数数据字符过长报错的问题解决方
    selectGROUP_CONCAT(uid)asuids,spread_uidfromeb_user_spreadwhereuid<>spread_uidGROUPBYspread_uid使用GROUP_CONCAT函数将字符串连接起来,数据量大的时候,会......