参考书籍:《Pointers in C: A Hands on Approach》
函数指针,即指向函数地址的变量。通过函数指针可以实现函数调用。函数指针可以实现后期绑定。函数指针的价值主要体现在:统一函数入口以提高函数封装性,回调函数应用,提高函数调用灵活性。
- 函数指针的定义
函数指针的定义要根据要指向的函数定义来进行,一般形式:
//1.要指向的函数的声明
<返回类型> 函数名(参数表);
//2.对应的函数指针的声明,返回类型和参数表与要指向的函数声明相同
<返回类型> (*函数指针变量名) (参数表);
举例:
int Func(int a, int b); //要指向的函数的声明
int (*Func_ptr)(int a, int b); //对应的函数指针的声明
- 函数指针的初始化
函数指针变量初始化有两种方式,两种方式等效:
-使用取地址操作符: &
-使用隐含方式赋值: 直接用函数名赋值
//注意:函数名用不用&都可以,但是普通变量不能如此赋值
代码示例:
#include <malloc.h>
#include <stdio.h>
void show_num(int num)
{
printf("The num is %d \n", num);
}
int* add(int x, int y)
{
int* result = (int*)malloc(sizeof(int));
*result = x + y;
return result;
}
int main()
{
int* result;
void(*show_num_ptr)(int);
int* (*add_ptr)(int, int);
show_num_ptr = &show_num;
add_ptr = add;
show_num_ptr(5);
result = add_ptr(2, 2);
printf("The result is %d \n", *result);
return 0;//如果用VS出现闪退,可以按下Ctrl+F5来执行程序
}
- 函数指针与封装示例
#include <malloc.h>
#include <stdio.h>
void func_a(int num)
{
printf("func_a: The num is %d \n", num);
}
void func_b(int num)
{
printf("func_b: The num is %d \n", num);
}
void func_c(int num)
{
printf("func_c: The num is %d \n", num);
}
void func_(void(*func_ptr)(int), int num)
{
(*func_ptr)(num);
}
int main()
{
printf("Input Option: \n");
printf("1 func_a \n");
printf("2 func_b \n");
printf("3 func_c \n");
printf("4 exit \n");
int choice = 0;
int num;
while (choice != 4) {
printf("Input\n");
scanf_s("%d", &choice);
printf("Num to show\n");
scanf_s("%d", &num);
if (choice == 1)
func_(func_a, num);
else if (choice == 2)
func_(func_b, num);
else if (choice == 3)
func_(func_c, num);
else if (choice == 4)
break;
else
continue;
}
return 0;
}
- 函数指针数组
函数指针数组提供了一种利用数组索引的方式实现函数调用。限制条件:函数具有相同的返回类型,函数参数的数目和类型相同,这些函数可以使用函数指针数组。
//函数指针数组定义
<返回类型> (*函数指针变量[])(参数表)
//函数指针数组示例
#include <malloc.h>
#include <stdio.h>
int func_add(int x, int y)
{
return (x + y);
}
int func_sub(int x, int y)
{
return (x - y);;
}
int func_mul(int x, int y)
{
return (x * y);;
}
int func_div(int x, int y)
{
return (x / y);;
}
int(*func_ptr[])(int x, int y) = {func_add, func_sub, func_mul, func_div};
int main()
{
printf("Input Option: \n");
printf("1 func_add \n");
printf("2 func_sub \n");
printf("3 func_mul \n");
printf("4 func_div \n");
printf("5 exit \n");
int choice = 0;
int x, y;
while (choice != 5) {
printf("Input:\n");
scanf_s("%d", &choice);
printf("Input Nums: x y\n");
scanf_s("%d %d", &x, &y);
if (choice == 1)
printf("The result is : %d \n", func_ptr[0](x, y));
else if (choice == 2)
printf("The result is : %d \n", func_ptr[1](x, y));
else if (choice == 3)
printf("The result is : %d \n", func_ptr[2](x, y));
else if (choice == 4)
printf("The result is : %d \n", func_ptr[3](x, y));
else if (choice == 5)
break;
else
continue;
}
return 0;
}
//注意:使用函数指针数组时需要谨慎操作,避免数组访问越界