c语言函数指针做函数参数(即回调函数)(代码片段)

流楚丶格念 流楚丶格念     2023-01-24     486

关键词:

函数指针做函数参数(回调函数)

函数参数除了是普通变量,还可以是函数指针变量,也就是可以实现回调函数。

所谓回调,就是模块A要通过模块B的某个函数b()完成一定的功能,但是函数b()自己无法实现全部功能,需要反过头来调用模块A中的某个函数a()来完成,这个a()就是回调函数。

回调函数概念

回调函数是程序中一种常用的函数调用方式。其特点是可以在下层软件模块(宏观上的被调用者)中,调用来自上层的软件模块(宏观上的调用者)中的函数,这和通常的调用顺序是相反的。

程序的调用方式软件模块的关系,从总体上看,有上层软件模块和下层软件模块之分。

一般有三种调用方式

  1. 简单的同步调用上调下直接返回
  2. 带有回调的调用双向调用
  3. 异步调用一般基于消息或事件类似MFC的机制

带有回调的调用方式是一种双向调用模式,在这种方式中,下层模块的函数在被调用的时候,将会调用上层模块的某个函数,回调上层模块的函数至少有两个作用,一是监视下层模块函数的运行状态,二是干预下层模块函数的运行

在C语言中回调函数的基础是函数类型的指针。

回调函数的作用

回调函数的作用:回调函数的表现形式是一个某种类型的函数指针,这个函数由上层的软件模块实现,将这个函数指针通过某种方式传递给下层的软件模块,由下层的软件模块在某个时刻调用这个函数。

函数指针的本质是一个函地址,在32位的系统中,本质是一个32位无符号整数。

函数指针由上层模块传递到下层模块的传递方式是可以通过函数的参数传递,也可以使用结构体的成员进行传递。

回调函数调用时刻

调用回调函数的时刻一般有两种:

  • 一种是在上层模块调用下层模块的函数中,直接调用回调函数:
  • 另一种是使用注册的方式,在某个事件发生的时候下层模块调用回调函数。

回调函数的语法:

1.简单的函数类型为:无参数、无返回值的函数。

简单的回调函数的格式是这种形式。其类型的定义如下所示:

typedef void*T_SIMPLE_CALLBACK)(void);

注:回调函数可以是任意类型的函数指针,简单的形式是无任何参数,也没有返回值得函数指针

2.完全形式的回调函数

完全形式的回调函数可以按照如下方式实现,它包含两个无符号整数的参数,返回值也是无符号的整数。其类型的定义如下所示:

typedef unsigned int*T_FULL_CALLBACK)(unsigned int para1,unsigned int para2);

具体例如这样:

//形参为普通变量
void fun( int x )
//形参为函数指针变量
void fun( int(*p)(int a) )

函数指针变量常见的用途之一:是把指针作为参数传递到其他函数,指向函数的指针也可以作为参数,以实现函数地址的传递。

注:

1.典型的回调函数包含两个整数型参数和整数返回值,第一个参数由下层定义,第二个参数由上层定义返回值是上层经过回调反馈给下层的
2.事实上,这种回调机制在一个系统的各个层次软件协同处理的时候很常用。例如,下层模块表示一个GUI系统,具有绘制界面的功能,上层将模块将回调函数的指针传递给下层,当界面产生“事件”的时候,调用回调函数执行上层软件模块所定制的行为。

代码案例:模拟计算器

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int plus(int a, int b)

	return a + b;

int sub(int a, int b)

	return a - b;

int mul(int a, int b)

	return a * b;

int division(int a, int b)

	return a / b;


//函数指针 做函数的参数 --- 回调函数
void Calculator(int(*myCalculate)(int, int), int a, int b)

	int ret = myCalculate(a, b); //dowork中不确定用户选择的内容,由后期来指定运算规则
	printf("ret = %d\\n", ret);


void test01()

	printf("请输入操作符\\n");
	printf("1、+ \\n");
	printf("2、- \\n");
	printf("3、* \\n");
	printf("4、/ \\n");

	int select = -1;
	scanf("%d", &select);

	int num1 = 0;
	printf("请输入第一个操作数:\\n");
	scanf("%d", &num1);

	int num2 = 0;
	printf("请输入第二个操作数:\\n");
	scanf("%d", &num2);

	switch (select)
	
	case  1:
		Calculator(plus, num1, num2);
		break;
	case  2:
		Calculator(sub, num1, num2);
		break;
	case 3:
		Calculator(mul, num1, num2);
		break;
	case 4:
		Calculator(division, num1, num2);
		break;
	default:
		break;
	



int main()

	while (1)
	
		test01();
	
	return 0;

运行结果为:

c语言提高:函数指针做函数参数(代码片段)

文章目录题目知识回顾代码题目请构造一个接口函数,实现对两个整数执行某种操作,该操作由调用者实现。要求:测试案例对两个整数进行加减运算知识回顾函数指针的三种定义与使用方式:https://yangyongli.blog.c... 查看详情

c语言提高:函数指针做函数参数(代码片段)

文章目录题目知识回顾代码题目请构造一个接口函数,实现对两个整数执行某种操作,该操作由调用者实现。要求:测试案例对两个整数进行加减运算知识回顾函数指针的三种定义与使用方式:https://yangyongli.blog.c... 查看详情

c语言:函数指针与指针函数(代码片段)

文章目录C语言:函数指针与指针函数一、概念二、创建形式2.1普通函数创建形式:2.2指针函数创建形式:2.3函数指针创建形式:三、使用例子3.1指针函数返回字符串3.2函数指针做回调函数C语言:函数指针与指... 查看详情

这是我看过最全面讲解嵌入式c语言回调函数和函数指针的教程(代码片段)

...函数。函数指针是指向函数的指针变量。通过函数指针C语言可以实现各种强大的功能与设计方法。而回调函数是函数指针最常见的用途,是C语言的重中之重,也是C语言面试当中的必考知识点和难点。在我们平时开发STM32... 查看详情

这是我看过最全面讲解嵌入式c语言回调函数和函数指针的教程(代码片段)

...函数。函数指针是指向函数的指针变量。通过函数指针C语言可以实现各种强大的功能与设计方法。而回调函数是函数指针最常见的用途,是C语言的重中之重,也是C语言面试当中的必考知识点和难点。在我们平时开发STM32... 查看详情

c语言基础:函数指针与回调函数size_t类型(代码片段)

1.函数指针函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明:/... 查看详情

函数指针&回调函数(代码片段)

函数指针:  函数指针是指向函数的指针变量,并且函数指针可以像一般函数一样,用于调用函数、传递参数.指针变量的声明:typedef(*定义的名字)(参数,参数),suchas: int(*fun_ptr)(int,int);源码:#include<stdio.h>intmax(intx,inty)retu... 查看详情

模拟实现qsortatoi函数,小白快来看(代码片段)

...明模拟实现qsortatoi函数简介模拟实现atoiqsort函数qsort函数C语言编译器函数库自带的排序函数。qsort的函数原型是voidqsort(voidbase,size_tnum,size_twidth,int(__cdeclcompare)(constvoid*,constvoid*));是base所指数组进行排序。qsort函数包含在C标准库-<... 查看详情

如何快速理解函数指针与回调函数?(代码片段)

...函数。函数指针是指向函数的指针变量。通过函数指针C语言可以实现各种强大的功能与设计方法。而回调函数是函数指针最常见的用途,是C语言的重中之重,也是C语言面试当中的必考知识点和难点。在我们平时开发STM32... 查看详情

函数指针与回调函数(代码片段)

函数指针与回调函数函数指针函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的... 查看详情

零基础学c语言知识总结十:指针做函数参数,指针做函数返回类型(代码片段)

...xff0c;所以要引用上指针来传递。指针做函数参数:在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使... 查看详情

c语言使用回调函数模拟委托与反射

...0c;一起进步!👇来源:头条-小智雅汇函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被调函数(callee)参数包含函数指针,函数指针还可以... 查看详情

c语言进阶笔记深入了解进阶指针(代码片段)

目录前言指针进阶字符指针指向常量字符串的指针指针数组指针数组打印数组内容数组指针对数组指针的理解&数组名和数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参函数指... 查看详情

c语言进阶笔记深入了解进阶指针(代码片段)

目录前言指针进阶字符指针指向常量字符串的指针指针数组指针数组打印数组内容数组指针对数组指针的理解&数组名和数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参函数指... 查看详情

详解c语言指针(代码片段)

文章目录1.字符指针2.指针数组3.数组指针3.1数组指针的定义3.2&数组名和数组名的区别3.3数组指针的使用4.数组参数,指针参数4.1一维数组传参4.2二维数组传参4.3一级指针传参4.4二级指针传参5.函数指针6.函数指针数组7.指向... 查看详情

python回调函数用法实例(代码片段)

Python回调函数用法实例 回调函数  “回调函数就是一个通过函数指针调用的函数。  如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。&rdqu... 查看详情

c语言的回调函数

请详细介绍什么是回调函数,用法,具体的应用等,越详细越好!有链接也可以。参考技术AcallbackFunction回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序... 查看详情

c语言回调函数produce(arr,len,getrand)(代码片段)

基本介绍回调函数:形参中包含另一个函数的函数指针用函数指针接收另一个函数案例代码解析具体代码#include<stdio.h>#include<stdlib.h>//回调函数--//函数原型intgetRand();int*produce(int*arr,intlen,int(*get)());intmain() intarr[10]; intlen=s... 查看详情