面试题--函数指针的五大作用
1,回调函数机制
函数指针常用于实现回调函数。通过将函数指针作为参数传递给另一个函数,可以在特定事件发生时调用预定义的函数。这种机制在事件处理、异步编程等场景中很常见。例如,图形用户界面(GUI)库中的按钮点击事件处理函数就是通过回调函数实现的。
#include <stdio.h>
// 回调函数类型
typedef void (*CallbackFunction)(int);
// 执行回调函数的函数
void performCallback(CallbackFunction callback, int value) {
callback(value);
}
// 回调函数1
void callback1(int value) {
printf("Callback 1: %d\n", value);
}
// 回调函数2
void callback2(int value) {
printf("Callback 2: %d\n", value * 2);
}
int main() {
// 使用回调函数1
performCallback(callback1, 5);
// 使用回调函数2
performCallback(callback2, 10);
return 0;
}
2,动态函数调用
函数指针允许在运行时动态地选择要调用的函数。这在需要根据条件选择不同实现的情况下很有用,可以增加程序的灵活性和可扩展性。例如,可以根据用户输入的选项调用不同的处理函数。
#include <stdio.h>
// 函数类型
typedef void (*FunctionPointer)();
// 函数1
void function1() {
printf("Function 1\n");
}
// 函数2
void function2() {
printf("Function 2\n");
}
int main() {
// 函数指针
FunctionPointer funcPtr;
// 根据条件选择要调用的函数
if (condition) {
funcPtr = function1;
} else {
funcPtr = function2;
}
// 调用选择的函数
funcPtr();
return 0;
}
3,函数指针数组
可以创建一个函数指针数组,每个元素是一个指向特定函数的指针。这样的数组可以用于实现状态机、菜单驱动程序等。例如,可以用一个函数指针数组来实现一个简单的命令行菜单系统。
#include <stdio.h>
// 函数类型
typedef void (*MenuFunction)();
// 函数1
void function1() {
printf("Option 1\n");
}
// 函数2
void function2() {
printf("Option 2\n");
}
int main() {
// 函数指针数组
MenuFunction menu[] = {function1, function2};
// 用户选择的菜单项
int choice;
// 获取用户输入
printf("Enter your choice (1 or 2): ");
scanf("%d", &choice);
// 调用选择的函数
if (choice >= 1 && choice <= 2) {
menu[choice - 1](); // 数组索引从0开始,需要减1
} else {
printf("Invalid choice\n");
}
return 0;
}
4,动态库加载
在动态库加载的情景中,函数指针用于获取动态库中的函数地址。这样,你可以在运行时决定是否加载某个库,以及调用库中的哪些函数。
#include <stdio.h>
#include <dlfcn.h>
typedef void (*LibraryFunction)();
int main() {
// 加载动态库
void *libHandle = dlopen("mylibrary.so", RTLD_LAZY);
if (libHandle) {
// 获取动态库中的函数地址
LibraryFunction libFunction = dlsym(libHandle, "myFunction");
if (libFunction) {
// 调用动态库中的函数
libFunction();
} else {
fprintf(stderr, "Error: Function not found\n");
}
// 关闭动态库
dlclose(libHandle);
} else {
fprintf(stderr, "Error: Unable to load library\n");
}
return 0;
}
5,函数指针作为参数
函数指针可以作为函数的参数,这样可以将函数作为另一个函数的参数传递,实现更灵活的函数组合。
#include <stdio.h>
// 函数类型
typedef int (*OperationFunction)(int, int);
// 加法函数
int add(int a, int b) {
return a + b;
}
// 减法函数
int subtract(int a, int b) {
return a - b;
}
// 执行操作的函数
int performOperation(OperationFunction operation, int a, int b) {
return operation(a, b);
}
int main() {
// 使用加法函数
int resultAdd = performOperation(add, 5, 3);
printf("Result of addition: %d\n", resultAdd);
// 使用减法函数
int resultSubtract = performOperation(subtract, 5, 3);
printf("Result of subtraction: %d\n", resultSubtract);
return 0;
}
==========
往期回顾:
中值滤波的原理和C代码
移动平均滤波的原理和C代码
MOS管防反接电路
STM32的看门狗原理和示例代码
==========