详解详解C语言编程中的函数指针以及函数回调语言编程中的函数指针以及函数回调
主要介绍了C语言编程中的函数指针以及函数回调,函数回调实际上就是让函数指针作函数参数、调用时传入函数
地址,需要的朋友可以参考下
函数指针:
就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数。
我们先来定义一个简单的函数:
//定义这样一个函数
void easyFunc()
{
printf("I'm a easy Function");
}
//声明一个函数
void easyFunc();
//调用函数
easyFunc();
//定义这样一个函数
void easyFunc()
{
printf("I'm a easy Function");
}
//声明一个函数
void easyFunc();
//调用函数
easyFunc();
上面三个步骤就是我们在学习函数的时候必须要做的,只有通过以上三步我们才算定义了一个完整的函数。
如何定义一个函数指针呢?前面我们定义其他类型的指针的格式是 类型 * 指针名 = 一个地址,比如:
int *p = &a;//定义了一个存储整形地址的指针p
也就是说如果我们要定义什么类型的指针就得知道什么类型,那么函数的类型怎么确定呢?函数的类型就是函数的声明把函数名
去掉即可,比如上面的函数的类型就是:
void ()
我们再来声明一个有参数和返回值的函数:
int add(int a, int b);
上面函数的类型依旧是把函数名去掉即可:
int (int a, int b)
既然我们知道了函数的类型那么函数指针的类型就是在后面加个 * 即可,是不是这样呢?
int (int a, int b) * //这个是绝对错误的
上面这么定义是错误的,绝对是错误的,很多初学者都这样去做,总觉得就应该这样,其实函数指针的类型的定义正好比较特
殊,它是这样的:
int (*) (int a, int b);//这里的型号在中间,一定要用括号括起来
int (*) (int a, int b);//这里的型号在中间,一定要用括号括起来
我们定义函数指针只需在 * 后面加个指针名称即可,也就是下面这样:
int (*p)(int a, int b) = NULL;//初始化为 NULL
int (*p)(int a, int b) = NULL;//初始化为 NULL
如果我们要给 p 赋值的话,我们就应该定义一个返回值类型为 int ,两个参数为 int 的函数:
int add(int a, int b)
{
return a + b;
}
p = add;//给函数指针赋值