我觉得回调函数的灵魂有一下几个:
1.要知道函数名就是地址
2.对函数指针的熟悉,什么是函数指针,什么是指针函数
3.回调函数本质用法就是 这个函数的功能可以根据用户传入的参数去执行不同的函数 是不是有点抽象
4.只执行 printf;不加()会不会报错。printf 和 printf() 有什么区别。
搞懂这些,回调函数自然很简单。
我这里给出我简单写的 代码 供同志们学习参考。
#include <stdio.h>
//自定义函数指针 为了回调函数 统一函数指针类型 有些参数实际在某个函数中不参与运算
typedef void(*pfunc)(int, int, int, char *);
//内联函数声明
extern int climb_stairs_in(int n);
//内联函数 爬楼梯时需要
inline int climb_stairs_in(int n)
{
if(n == 1)
{
return 1;
}
else if(n == 2)
{
return 2;
}
else
{
return climb_stairs_in(n-1) + climb_stairs_in(n-2);
}
}
///阶乘函数 调用此函数需要相应设置 @n:的值
///只有@n:参数是有效参数,其他参数均未参与函数内部运算
void factorial(int n, int q, int ret ,char *arr)
{
static int num = 1 ;//静态变量,防止每次调用自己导致num数值被重置
if( n == 1)
{
printf("阶乘结果是%d\n",num);
return;
}
else
{
num *= n;
factorial(n-1, q, ret, arr);
}
}
///爬楼梯函数 调用此函数需要相应设置 @n:的值
///只有@n:参数是有效参数,其他参数均未参与函数内部运算
void climb_stairs(int n, int q, int ret, char *arr)
{
if(n <= 1)
{
printf("有%d种方法爬楼梯",n);
return;
}
else if(n == 2)
{
printf("有%d种方法爬楼梯",n);
return;
}
else
{
//因为需要获取climb_stairs(n-1)和climb_stairs(n-2)的值
//而此函数无返回值 所以运用内联函数 借此来获取 n>=3情况下的值
int num = climb_stairs_in(n);
printf("有%d种方法爬楼梯\n",num);
}
}
///幂运算函数 调用此函数需要相应设置 @n:和@q:的值 n^q
///只有@n:和@q:参数是有效参数,其他参数均未参与函数内部运算
void expon(int n, int q, int ret ,char *arr)
{
static int num = 1;
if(ret > q)
{
printf("幂运算结果是%d",num);
return;
}
else
{
num *= n;
expon(n, q, ret+1 ,arr);
}
}
///字符串翻转函数 调用此函数需要相应设置@arr:数组元素和 @n:的值 n = strlen(arr)
///只有@n:和@arr:参数是有效参数,其他参数均未参与函数内部运算
void string_flipping(int n, int q, int ret, char *arr)
{
if(n < 0)
{
return;
}
else
{
printf("%c",arr[n-1]);
string_flipping(n-1, q, ret, arr);
}
}
void func(pfunc fun_t, int n, int q, int ret, char *arr)
{
fun_t(n, q, ret, arr);
return;
}
int main(int argc, char const *argv[])
{
///@arr: 作为 string_flipping字符翻转函数中传入的数组
///@n:在factorial阶乘函数中@n:代表设置 数 的阶乘 例如: n!
/// 在climb_stairs爬楼梯函数中 @n:代表设置的层数 例如: n层楼梯
/// 在expon幂函数中 @n:代表设置的底数 例如 :n^8
/// 在string_flipping字符串翻转函数中 @n:代表字符串元素个数
///@q:在expon幂函数中 @q:代表 次幂 例如 2^q
///@ret:在expon幂函数中是一个计数器,已设置好参数为1,任何情况下,无需更改此值
char arr[] = {"abcdef"};
int n = 6;
int q = 8;
int ret = 1;
pfunc funcArr[4] = {factorial, climb_stairs, expon, string_flipping};
func(funcArr[3], n, q, ret, arr);
return 0;
}
那么同志们,可不要忘了内联函数,忘记的自己复习一下。
另外 这么多参数,是不是可以用 结构体呢, 我觉得学习就是不断思考, 别人的东西 取之精华,去其糟粕,相信我们会越来越进步!