函数类型
C语言中的函数也有自己的类型。
函数的类型由返回值,参数类型(还有参数顺序)和参数个数共同决定。
例: int add(int i,int j)的类型为int(int,int)
C语言中通过typedef为函数类型重命名,typedef type name(parameter list)
例:typedef int f(int,int); typedef void p(int);
函数指针
函数指针用于指向一个函数
函数名是执行函数体的入口地址
可通过函数类型定义函数指针:FuncType* pointer;或者直接定义;Functype(*pointer)(parameter list);其中pointer为函数指针变量名,type为指向函数的返回值的类型,parameter list为指向函数的参数类型列表。
例:函数指针的本质与使用
#include <stdio.h>
typedef int(FUNC)(int);
int test(int i)
{
return i * i;
}
void f()
{
printf("Call f()...\n");
}
int main()
{
FUNC* pt = test;
void(*pf)() = &f;
pf();
(*pf)();
printf("Function pointer call: %d\n", pt(2));
}
回调函数
回调函数是利用函数指针实现的一种调用机制,来解决只有在执行到某阶段时才知道应该调用那个函数的实际问题。
回调函数原理:
调用者不知道具体事件发生的时候需要调用的具体函数
被调用者不知道自己何时被调用,只知道被调用后需要完成的任务
当具体事件发生时,调用者通过函数指针调用具体函数
回调机制将调用者和被调用函数分开,两者互不依赖,更加灵活,且适合模块化接口化编程
例:回调函数实例
#include <stdio.h>
typedef int(*FUNCTION)(int);
int g(int n, FUNCTION f)
{
int i = 0;
int ret = 0;
for(i=1; i<=n; i++)
{
ret += i*f(i);
}
return ret;
}
int f1(int x)
{
return x + 1;
}
int f2(int x)
{
return 2*x - 1;
}
int f3(int x)
{
return -x;
}
int main()
{
printf("x * f1(x): %d\n", g(3, f1));
printf("x * f2(x): %d\n", g(3, f2));
printf("x * f3(x): %d\n", g(3, f3));
}
复杂指针函数的阅读技巧---右左法则
1.从最里层的圆括号中未定义的标识符看起
2.首先往右看,再往左看
3.当遇到圆括号或者方括号的时候就可以确认部分类型
4.对剩余未确认部分重复2,3步骤,直到阅读结束。
例:解读以下复杂指针
#include <stdio.h>
int main()
{
int (*p2)(int*, int (*f)(int*));
int (*p3[5])(int*);
int (*(*p4)[5])(int*);
int (*(*p5)(int*))[5];
}
//int (*p3[5])(int*)<===>p3[5]数组<===>int (*)(int *)<===>*p3[5]是指针数组,大小为5<===>int ()(int *)每个数组元素是int(int*)的函数
//int (*(*p4)[5])(int*)<===>(*p4)是指针<===>int(*[5])(int*)<===>p4是数组指针,指向一个5个大小的数组
//<===>int(*)(int*)<===>每个数组元素是指针<===>int()(int*)<===>每个元素指针指向一个类型为int()(int*)的函数