函数指针
如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针 eg:
int (p)(int,int) 定义p是一个指向函数的指针变量,它可以指向函数的类型为整形且有俩个整型参数的函数。p的类型用int()(int,int)表示
函数指针最常用的俩个用途是
1)转换表
2)作为参数传递另一个函数
注意:简单的声明一个函数指针并不意味着它马上可以使用。和其他指针一样,对函数指针执行间接访问之前必须把它初始化为指向某个函数。举个例子:
int f(int);
int (*pf)(int) = &f;
在函数指针被声明且初始化后,我们就可以用以下三种方式调用函数:
int a;
a=f(25);
a=(*pf)(25);
a=pf(25);
注意:对指向函数的指针变量不能进行算数运算 ,如p+n,p++,p–
函数指针数组
数组是一个存放相同类型数据的存储空间,把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
int arr[10]; //数组的每个元素是int 此为指针数组
int (*parr1[10])( ); //函数指针数组
parr1 先和 [] 结合,说明parr1是数组 且其基类型为整型
转移表
int sub(int a, int b){
return a - b;
}
int add(int a, int b){
return a + b;
}
int mul(int a, int b){
return a * b;
}
int Div(int a, int b){
if (b!=0)
return a / b;
}
//转移表
int main12(){
int(*p[])(int, int) = { add, sub, mul, Div }; //函数指针数组
int len = sizeof§ / sizeof(p[0]);
for (int i = 0; i < len; i++){
printf("%d\n\a", p[i](6, 2));
}
system(“pause”);
return 0;
}
指向函数指针数组的指针
type (*(*p)[4])()
(*p)[4] 指针数组
(*p)( ) 函数指针
结合起来就是函数指针数组的指针
void test(const char* str) {
printf("%s\n", str);
}
int main() {
//函数指针pfun
void (pfun)(const char) = test;
//函数指针的数组pfunArr
void(pfunArr[5])(const char str);
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(ppfunArr)[10])(const char) = &pfunArr;
system(“pause”);
return 0;
}
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这 个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而 是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。