[C语言]函数和指针居然也有一腿??让我们一起来了解回调函数
2018-01-06 20:35
295 查看
指向函数的指针
函数的入口地址和地址
我们知道在C语言中如果要调用一个函数,首先应该好到其入口地址,从入口顺序执行,这就叫做函数的入口地址.例如int fun(){ return 3; }
其中标识符fun就是函数的入口地址
可以类比:定义一个数组,数组名就代表其首元素地址
我们还可以通过对fun函数取地址
&fun;
来找到函数的地址
类比定义一个数组,对数组名取地址就代表整个数组的地址.
函数取地址有什么作用呢?我们可以通过调用函数时开辟的结构特性来隐式的调用函数,有兴趣的小伙伴可一参阅我的另一篇博客
利用栈帧结构特性来偷偷偷偷偷偷偷地悄无声息地调用函数
函数指针
现在, 我们找到了函数的入口地址,那么我们就该指针粉墨登场了~因为现在我们可以这样认为指针了只要你敢开辟地址空间,我就敢指向你
函数指针的定义
int (*a)();
这是一个指向返回值为整型的函数的指针
再将fun函数的入口地址地址赋值给这个指针即可
int (*a)()=fun;
注意
因为运算优先级的问题所以要写成(*a)否则
int *a();
就是返回值为整型指针的无参函数了,注意两者区别
2. 类似数组,函数fun和&fun虽然意义不同但都指向统一块内存空间,所以在赋值的时候并无区别,但在对指针进行移动时会有很大区别.
函数指针的应用
转移表
我们还记得指针数组吗?int (*a)[];
如果这个数组里面的指针指向的是函数,那么我们就称函数指针数组叫做转移表,定义如下
int (*a[])();
这里有一个转移表的用处,实现一个整型四则运算器
#include<stdio.h> //先写好相应函数 int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { if (y == 0) { printf("错误,除数为0"); return 0; } return x / y; } int main() { //定义参与运算的两数 int x,y; //定义选项 int choose; //定义返回值 int ret; //将四个函数的入口地址装入转移表中,其中0是为了循环退出方便 int(*a[])(int, int) = { 0, add, sub, mul, div }; while (choose) { printf("**************\n"); printf("1:add 2:sub\n"); printf("3.sub 4.div\n"); printf("0.exit\n"); printf("**************\n"); scanf("%d%d", &x, &y); ret = (a[choose])(x,y);//调用对应的函数 } getchar(); return 0; }
此函数转移表按需求调用了相应函数.
回调函数
指针函数还有一个用处是回调函数回调函数是用过函数指针调用的函数,如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数的时候,我们就说这是回调函数.回调函数不是用该函数的实现方直接调用,而是在特定的时间或条件发生时由另外的一方调用,用于对该事件或条件的相应.
是不是看着有点晕?用大白话来解释一下
一个魔术师要表演魔术,需要观众给他一张100块,然后可以给观众变出两张100块.
站在观众的角度,我的工作只要准备100块,然后等着魔术师变戏法就行了.(无需知道如何变魔术)
站在魔术师角度,我工作只是变魔术,需要的100块由观众提供,我不管.
我们把它抽象成代码
void 提供moeny() { 从钱包掏出100块; return 100块; }
void 变魔术( (*提供money)() )//把提供money的函数作为参数传了进来,说明变魔术的前提条件是什么 { palalala变魔术; 这时候需要100块了; 回调 提供钱的函数; palalala接着变魔术; }
我们称作 提供money()是变魔术的回调函数.
本质要解决的问题就是
我一个魔术师,魔术怎么变应该只能我一个人知道!你给我提供变魔术必要的道具就OK,
抽象一下就是
函数A想在函数B上运行,但函数B对外界保密,函数A无法知道其内部运作,函数A就告知函数B函数A的存在,B通过一定系列动作调用A.
此时A就是B的回调函数.
回调函数有个经典qsort例子,我将在下一篇博客中退出,敬请期待!
全文完
感谢!相关文章推荐
- 初学C语言----指针深入了解 :指针与函数
- 【C语言】函数指针与回调函数
- C语言里函数指针的两种常见用途(回调函数与转移表)
- C语言的函数指针类型和回调函数-源码
- C语言中函数指针、指针函数、回调函数的简单含义
- 【C语言】二级指针,函数指针,回调函数
- C语言中的回调函数调用过程以及函数指针使用
- C语言,仿内核方式实现分级打印 [附:函数指针、回调函数的小示例]
- C语言之最好理解的通过函数指针作为参数实现回调函数
- c语言(函数指针,回调函数)
- C语言--函数指针和回调函数
- 【Struct(结构体)杂谈之八】小个头也有大智慧---C语言Struct中的函数和函数指针
- 【C语言】函数指针与回调函数
- C语言中的回调函数(函数指针)
- c语言之函数指针
- C语言之指针、数组和函数
- C语言之数组专题:数组指针、指针数组、数组做函数参数退化、数组名、数组类型
- c语言学习之基础知识点介绍(十五):函数的指针
- 巩固C语言(十)----指针数组 & 函数指针和指针函数
- 黑马程序员———C语言———【函数指针、指针函数、野指针、内存管理、const关键字】