回调函数的概念
您的理解是正确的。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;
}