1.函数指针
(1)指针是用来保存地址的,定义指针变量时,也需要明确给出指针变量的类型,使用函数指针调用函数时,直接传入参数,普通调用函数类似,只是将函数名替换为解引用指针变量。
(2) 函数指针的意义:可以使用同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。
(3)函数的地址:函数名就是函数的地址,就像数组名可以是数组的地址
int num; // 声明整型变量
int* pnum; // 声明整型指针变量
void func(int); // 声明函数
void (*pfunc)(int); // 声明函数指针, pfunc 就是一个函数指针变量 ,声明函数指针时,
// 参数只需要给出类型,这里是整型,不需要具体命名,也可以加上 void (*pfunc)(int x)
// 例1:
void test(const char* str)
{
printf("%s\n", str);
}
int Add(int x, int y)
{
return x + y;
}
int main()
{
void (*pfun)(const char*) = test; // 定义一个函数指针 pfun 让它指向 test 函数
(*pfun)("hello"); // test 函数没有返回值,所以不需要接收返回值,直接使用指针调用函数(穿参数)
int (*pAdd)(int x, int y) = Add; // 定义一个函数指针 pAdd 让它指向 Add 函数
int ret = (*pAdd)(10, 20); // 用 ret 来保存函数调用返回值
printf("%d\n", ret);
return 0;
}
// 例2:
void Eating(const char* str)
{
printf("%s\n", str);
}
void Sleeping(const char* str)
{
printf("%s\n", str);
}
void Doing(void(*pfunc)(const char*), const char* msg)
{
pfunc = Eating; // 让函数指针指向 Eating
printf("%s", msg);
(*pfunc)("i am eating");
pfunc = Sleeping; // 让函数指针指向 Sleeping
(*pfunc)("i am sleeping");
}
int main()
{
void (*pfunc)(const char*);
Doing(pfunc, "hello,");
return 0;
}
输出结果:
2.函数指针数组
这是一个数组,数组中的元素是指针,指针的类型是函数指针。函数指针数组可以更方便的调用函数,访问数组元素就可以调用函数,如上 例2 的场景,可以将 函数指针的两个值存入数组,只需要改变数组下标就可以调用不同的函数。
void (*pfunc[4])(const char* str); // 声明函数指针数组
// 函数指针数组的使用
// 例:
void Eating(const char* str)
{
printf("%s\n", str);
}
void Sleeping(const char* str)
{
printf("%s\n", str);
}
void Playing(const char* str)
{
printf("%s\n", str);
}
void Studying(const char* str)
{
printf("%s\n", str);
}
int main()
{
void (*pfunc[4])(const char*) = {Eating, Sleeping, Playing, Studying}; // 定义函数指针数组
pfunc[0]("i am eating."); // 以访问数组元素的形式,调用函数
pfunc[1]("i am sleeping.");
pfunc[2]("i am playing.");
pfunc[3]("i am studying.");
return 0;
}
输出结果:
3.函数指针数组指针
就是在函数指针数组的基础上,再定义一个指针变量来保存这个数组的地址,可以向数组指针一样理解,对指针解引用后就可以访问数组元素
void (*(*pArr)[4])(const char*) ; // 声明函数指针数组指针
// 函数指针数组指针的使用
// 例:
void Eating(const char* str)
{
printf("%s\n", str);
}
void Sleeping(const char* str)
{
printf("%s\n", str);
}
void Playing(const char* str)
{
printf("%s\n", str);
}
void Studying(const char* str)
{
printf("%s\n", str);
}
int main()
{
void (*pfunc[4])(const char*) = {Eating, Sleeping, Playing, Studying}; // 定义函数指针数组
void (*(*pArr)[4])(const char*) = &pfunc; // 定义函数指针数组指针
(*pArr)[0]("i am eating again."); // 对指针解引用来访问数组元素,调用函数
(*pArr)[1]("i am sleeping again.");
(*pArr)[2]("i am playing again.");
(*pArr)[3]("i am studying again.");
return 0;
}
输出结果: