自学内容网 自学内容网

C 语言回调函数

 回调函数的概念

您的理解是正确的。pFunCallBack 是一种函数指针类型,它定义了函数的签名(即函数的参数类型和返回类型)。当我们说 pFunCallBack pFun,我们是在声明一个变量 pFun,其类型是 pFunCallBack —— 即一个函数指针,该指针可以存储指向任何具有相同签名的函数的地址。

transFrom 函数中,pFun 作为参数接收这样的一个函数地址。当我们将 show 函数作为参数传递给 transFrom 函数时,我们实际上是在传递 show 函数的地址,这使得 transFrom 能够调用 show 函数来处理数组中的每个元素。

这里的关键点是,show 函数的签名(即它接受一个整型指针作为参数且没有返回值)与 pFunCallBack 类型相匹配,这意味着 show 可以被安全地存储在 pFun 函数指针变量中,并在 transFrom 函数内部被调用。

transFrom 在其循环中遇到数组的每个元素时,它通过 pFun 指针调用 show 函数,传递当前元素的地址。show 函数随后使用 printf 打印该元素的值。这种设计允许 transFrom 函数非常灵活,因为它可以被配置为使用不同的回调函数执行不同的操作,而不必修改函数本身。

 数组指针指向的是数组的地址,函数指针指向的是函数的地址,函数的名字表示地址的首元素

#define  _CRT_SECURE_NO_WARNINGS
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

// 创建函数指针类型
typedef void(*pFunCallBack)(int);

// 回调登记函数
void transFrom(int arr[],int len,pFunCallBack pFun) 
{
for (int i; i < len; i++) 
{
pFun(arr[i]);
}
}

// 回调函数用来输出数组中的数据
void show(int num) 
{
printf("%d ", num);
}


int main()
{
int arr[5] = { 1,2,3,4,5 };
transFrom(arr, 5, show);
return 0;
}

 


回调函数不同的函数操作

#define  _CRT_SECURE_NO_WARNINGS
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

// 创建函数指针类型
typedef void(*pFunCallBack)(int*);

// 回调登记函数
void transFrom(int arr[],int len,pFunCallBack pFun) 
{
for (int i = 0; i < len; i++) 
{
pFun(&arr[i]);
}
}

// 回调函数用来输出数组中的数据
void show(int *num) 
{
printf("%d ", *num);
}

void add1(int *num) 
{
(*num)++;
}

// 把数组逆序
void reverse(int* num) 
{
// 获取到数组的一个
if (*num < *(num + 1)) 
{
int t = *num;
*num = *(num + 1);
*(num + 1) = t;
}
}

int main()
{
int arr[5] = { 1,2,3,4,5 };
transFrom(arr, 5, show);
transFrom(arr, 5, add1);
putchar('\n');
transFrom(arr, 5, show);
putchar('\n');
for (int i = 0; i < 5; i++) 
{
transFrom(arr, 5, reverse);
}
transFrom(arr, 5, show);
return 0;
}


原文地址:https://blog.csdn.net/qq_45973003/article/details/140578269

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!