函数指针、回调函数
【0】指针
Int a ;//定义整型变量
Int *p;//定义指针变量
-------------------------------
Int a = 10; //整形变量的初始化
P = &a ; //指针变量的初始化,取地址
则 *p <=> a
通过上面例子可以知道,通过指针可以获取其他变量所存的值。
【2】数组和指针的关系
P [i] < = > *(p+i) // 数组名是个指针常量,存放了数组的第一个元素的地址。
【3】函数名,其实也是个地址
和数组名类似,函数名也存放了函数的地址。
- 函数指针:指向函数的指针 //指针函数只是函数的返回值是指针
例如:
void (*p)(void) //函数指针,指向无参数无返回值的函数
Void *(*p)(int *)//函数指针,指向 void * fun_name(int *a) 形式的函数
好处: p可以随意修改。
#include <stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
// 先定义函数指针 *p ,并将初始化(给函数指针赋值)
int (* p)(int, int) = & max; // &可以省略
int a, b, c, d;
printf("请输入三个数字:");
scanf("%d %d %d", & a, & b, & c);
/* 与直接调用函数等价,d = max(max(a, b), c) */
//函数指针的调用形式
d = p(p(a, b), c); //函数指针的运行方式(实际就是函数指针所指向的函数的运行方式),可以是p();或者原始的调用方式(*p)() ;
printf("最大的数字是: %d\n", d);
return 0;
}
- 回调函数,当函数指针被用作函数的参数。
函数指针被作为函数 xxxx 的参数,xxxx函数成为回调函数。
功能: 将双向依赖改为单向依赖的工具。
回调函数:在定义的模块不运行,交给另一个模块运行 的函数。(简单说就是调用一个函数,这个函数用去调用其他的函数)
使用条件:
2.1 简单例子:可以直观的看下回调函数的形式
(3)回调函数,用以改变库run.c 的某些行为
3.1 不带参数
Run.c
#include <unistd.h>
//在run循环里,每隔1S运行一个函数,这个函数有main 来指定(函数放在main.c里)
Void (*step)(void) = NULL; //函数指针
Void run(void)
{
Int ct=0;
While (1)
{
If(Step() != NULL)
Step();
Ct ++;
Sleep(1);
}
}
//安装函数
Void cb_install (void(*p)(void))
{
Step = p;
}
Main.c
//声明后再使用
//Extern void(*step)(void);
Void cb_install (void(*p)(void));
Void mystep_cb(void)
{
Print(“ 即使到秒\n”);
}
Int main(void)
{
Cb_install(mystep_cb)
//Step = mystep_cb;
Run();
}
3.2 带参数
Run.c
#include <unistd.h>
//在run循环里,每隔1S运行一个函数,这个函数有main 来指定(函数放在main.c里)
Void (*step)(int) = NULL; //函数指针
Void run(void)
{
Int ct=0;
While (1)
{
If(Step() != NULL)
Step(ct);
Ct ++;
Sleep(1);
}
}
//安装函数
Void cb_install (void(*p)(int))
{
Step = p;
}
Main.c
//声明后再使用
Void cb_install (void(*p)(int));
Void mystep_cb(int i)
{
Print(“ 即使到秒,i=%d\n”, i);
}
Int main(void)
{
Cb_install(mystep_cb)
Run()
}
【4】数组指针
Int v[2][10] = {
{1,2,3,4,5,6,7,8,9,10},
{11,12,13,14,15,16,17,18,19,20}
};
Int (*a)[10] = v; //数组指针,指针指向一个10个int元素的数组。
【5】指针数组
Int p = 5;
Int p2 = 6;
Int *p[5];
Ptr[0] = &p; //ptr[] 存放的是地址,他指向的位置就是 //*ptr[0]
Ptr[1] = & p2;