面试题--函数指针的五大作用

5caa0245f2083ae993844aa0ef7e6fbb.png

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的看门狗原理和示例代码

==========

e9a459557d5f5b08aa62425443c8bbdb.png

3b0360538bfc492e4f67f7791ae33434.png

7f669762582f5257cae73b2f2723871b.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值