目录:
一、函数名作为函数的输入参数
二、回调函数
1、回调函数的引入
2、回调与普通函数的调用
3、回调函数的作用
4、回调函数的程序编写
一、函数名作为函数的输入参数
函数参数传递分为两种,一种是值传递,一种是地址传递。一般我们传递时用的是地址传递。因为,若是采用值传递的话,比如我们传递一个数组 double a[100],则在调用函数的时候。编译器会把这整个数组复制到函数中,这样使用的空间是100*sizeof(double)=800。若是我们只传递数组名 a 这个地址的话,那么复制进去的空间只有 64/8=8 这么多(假设计算机64位)。这样比较下来,就有了100倍的差距,是不是很吓人。所以,不管是函数作为参数,还是数组,结构体什么的,我们一般都用地址传递,而不用值传递。
1)函数地址如何传递
先说一次传递一个函数: 我们先定义一个函数
double add(double x, double y) { return x + y; }
讯享网
然后接着建立一个函数指针
讯享网double (*pf)(double,double) = add; //这里(*pf)的括号不能省,即把add的地址给了指针pf
我们现在有一个函数:
double calculate(double x1, double y1, double(*f)(double, double)) {//函数调用里面传递 函数指针数组 的方法 cout << "add:" << (*f)(x1, y1) << endl; // cout相当于printf();是输出函数,endl程序的结束符 return 1; }
然后我们来进行值传递
讯享网 int x = 2; y = 1; calculate(x, y, pf);
最后可以得到输出的结果是 2+1=3。
这是最基本的,下面讲我要说的重点,就是一次传递多个函数进去。想传递多个函数进去,我们要建立一个函数数组 。先定义两个函数:
double add(double x, double y) { return x + y; } double add2(double x, double y) { return x - y; }
然后建立函数数组并赋值 double (*pf[2])(double,double) = {add, add2};
接着传递给上面定义的calculate函数。调用方式为:calculate(x, y, pf);
calculate函数的接收方式应为:
讯享网double calculate(double x1, double y1, double(f)(double, double)) //传递的pf是一个数组的数组名且本身也是一个指针
即为二重指针或者
double calculate(double x1, double y1, double(*f[])(double, double))
最后给出完整的代码
讯享网#include "iostream" using namespace std; double add(double, double); double add2(double x, double y); double calculate(double x1, double y1, double(f)(double, double)) {//函数调用里面传递 函数指针数组 的方法 cout << "add:" << (*f[0])(x1, y1) << endl; cout << "add2:" << (*f[1])(x1, y1) << endl; return 1; } int main(void) { int x, y; double (*pf[2])(double,double) = {add, add2}; x = 2; y = 1; calculate(x, y, pf); system("pause()"); return 0; } double add(double x, double y) { return x + y; } double add2(double x, double y) { return x - y; }
在函数void function()中,需要将另外一个函数double input()的函数名作为输入参数。
定义函数指针:
typedef double (*P)(int);
Note:红色字体部分需要注意,函数input()所有的输入参数类型都需要包含在内。
例如 double input(double u[5], int num, double x),则在定义时写作 typedef double (*P)(double*,int,double)。
此时函数作为一种类型,可以直接被其它函数调用。
调用格式:函数声明中定义 void function(P input),调用function(input)即可。例子:
#include "stdio.h" #include "string.h" typedef int (*P)(int); void function(P input); int input(int a); int main(void) { function(input); return 0; } void function(P input) { printf("ok"); } int input(int a) { return a+5; }
typedef int (*p) (int *p);的说明:
定义一个函数指针类型(注意是类型)p,指向一个函数,该函数接受一个参数int *型,返回int。也就是说,有这样的定义:
讯享网typedef int (*p) (int *p); int foot(int *); //声明,foot在其它地方定义
可以这样使用:p pf = foot; //&foot也可以,一个意思。
二、回调函数
1、回调函数的引入
应用程序需要采集硬件层的数据,比如串口接收数据、按键采集、ADC值采集。这种硬件层的数据怎么通知应用层来拿,或者怎么主动给它?
我们以往最简单粗暴的方式是不是就是用一个全局变量,比方说硬件层串口接收到数据来了,那么我们把数据丢到数组里,然后把接收完成全局变量标志位置1。比方说全局变量名为RcvFlag,然后应用层程序会轮询判断RcvFlag==1?是的话就开始把数组里的数据取出来解析。
很多人就会说了,你看我用这种方法照样能实现功能啊,为什么还要学习别的架构。这样做当然可以实现功能,但是会存在移植性很差的问题。
2、回调与普通函数的调用
1)普通函数的调用
调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/35670.html