函数指针,转移表和回调函数的理解

函数指针

函数指针顾名思义就是将函数看做一个指针,用一个指针来保存函数的地址

函数指针的用法:

函数指针的正确写法是  void (*p1)() 而 void *p2() 是无法存放函数指针的,因为这是返回值为指针的函数,p1先与*结合,说明p1是一个指针,指针指向一个函数,指向的函数无参数,返回值类型为void。具体用法如下例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void check(char *a, char *b, int(*cmp)(const char *, const char *))
{
	if ((*cmp)(a, b) == 0)
		//cmp指向库函数strcmp(),调用cmp就是调用strcmp(),并且a和b作为参数
		printf("相同\n");
	else
		printf("不相同\n");
}
int main(void)
{
	char arr1[1024], arr2[1024];
	int(*p)(const char *, const char *);
	//将库函数strcmp的地址赋值给函数指针p
	//并且用限定符const保持调用后指针指向内容不变
	p = strcmp;

	printf("请输入两个字符串,然后进行对比\n");
	scanf("%s", &arr1);
	scanf("%s", &arr2);
	check(arr1, arr2, p);
	return 0;
}

函数指针数组

函数指针数组其实就是一组函数指针,两个的关系就好比如整数和整形数组,下面是函数指针数组的正确写法

int (*p[10])()     p先与[]结合,说明p1是数组,数组的内容就是int (*)()类型的函数指针

转移表

灵性运用转移表可以让我们的代码有更高的可维护性和可读性,并减少我们的代码量,转移表我个人理解就是将函数集中转移到同一个地方,这样就更加方便我们的阅读和理解,举个例子

如果不用转移表实现一个计算器的功能,我们一般的做法就是定义四个函数int add(int a,int b),int sub(int a,int b),int mul(int a,int b),int div(int a,int b),然后用一个switch语句分别调用这四个函数,但是如果我们用转移表就能减少工作量

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int add(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 div(int a, int b){
	return a / b;
}
int main(){
	int x, y;
	int choose=1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div };
	while (choose){
		printf("请选择您需要的操作,1:add    2:sub    3:mul    4:div    0:退出\n");
	    scanf("%d", &choose);
		if ((choose <= 4 && choose >= 1)){
			printf("请输入两个整数\n");
			scanf("%d %d", &x, &y);
			ret = (*p[choose])(x, y);
		}
		if (choose == 0){
			printf("欢迎下次使用\n");
		}
		else{
			printf("输入有误\n");
		}	
		printf("ret=%d\n", ret);
	}
	return 0;
}

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。而且回调函数还有个特点,那就是回调函数不是人为的主动调用,而是当某个特定时间或者条件发生时由另一方(操作系统或者第三方库)调用,用于对该事件或条件进行响应

下面是具体的例子

int main(){
	printf("hello world");
	return 0;
}//一般的hello world程序

把它改成回调函数形式

void print_text(){
	printf("hello world");
}//这是回调函数(被调用的函数)

void callback_function(void (*callbackfuct)()){
	callbackfuct();
}//这是实现回调函数的调用函数
//先在形参中定义函数指针,再从main函数中传入函数的地址
//然后在调用函数执行时通过函数指针调用回调函数

int main(){
	callback_function(print_text);
	//传回调函数的地址给调用函数
	return 0;
}

带参数的回调函数形式,原理和上面差不多

void print_text(char* s){
	printf("%s",s);
}

void callback_function(void (*callbackfuct)(),char* s){
	callbackfuct(s);
}

int main(){
	callback_function(print_text,"hello world");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值