函数指针
定义:函数指针是指向函数的指针变量,该指针指向这个函数。对于函数指针来说,函数指针就是指向函数的指针,它存储的就是函数的地址。
函数指针的声明:
声明格式:类型说明符 (*函数名) (参数)
typedef int (*fun)(int,int);
int add (int a, int b)
{
return a + b;
}
add 返回值是int类型,有两个int类型的参数,那如何声明为函数指针呢?可以将函数名add替换成(*fun),fun为函数指针名。函数指针是需要把一个函数的地址赋值给它,常见的写法有两种写法:
fun = add;
或者
fun = &add;
但是运算符&可以忽略。因为一个函数标识符就表示了它的地址。
实例
#include <stdio.h>
typedef int (*fun)(int ,int);//声明函数指针
int add (int a, int b)
{
return a + b;
}
int main(int argc, char const *argv[])
{
fun f1 = add;
printf("add = %d\n", (*f1)(2,4)); // 等价于 f1(2,4)
return 0;
}
调用函数指针的时候,写成(*f1)(2,4)可以清楚的指明这是通过指针的方式来调用函数。
输出结果
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
// 回调函数
void callback_fun(int *arr, int Size, int (*getValue)())
{
int i;
for ( i=0; i<Size; i++)
{
arr[i] = getValue();
}
}
// 获取随机值
int getRandValue()
{
return rand() % 100;
}
int main(int argc, char const *argv[])
{
int myarray[10];
int i;
callback_fun(myarray, 10, getRandValue);
for( i = 0; i < 10; i++) {
printf("%d ", myarray[i]);
}
printf("\n");
return 0;
}
输出结果:
总结:
声明函数指针需要指明函数的返回类型和形参类型。
函数指针本质是一个指针,其指向一个函数。
扫二维码关注微信公众号,获取技术干货