C语言-函数的调用

C语言-函数的调用目录 一 函数名作为函数的输入参数 二 回调函数 1 回调函数的引入 2 回调与普通函数的调用 3 回调函数的作用 4 回调函数的程序编写 一 函数名作为函数的输入参数 函数参数传递分为两种 一种是值传递 一种是地址传递 一般我们传递时用的是地址传递 因为 若是采用值传递的话

大家好,我是讯享网,很高兴认识大家。

目录:

一、函数名作为函数的输入参数

二、回调函数

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)普通函数的调用

调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”。

2)回调函数的调用

调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样调用程序和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
小讯
上一篇 2025-01-09 07:05
下一篇 2025-02-10 12:29

相关推荐

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