当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/159162.html

相关文章:

  • Python如何获取request response body
  • 【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析
  • HbuilderX 插件开发-模板创建
  • Python学习从0到1 day26 第三阶段 Spark ④ 数据输出
  • 信息收集—JS框架识别泄露提取API接口泄露FUZZ爬虫插件项目
  • NodeJS 百度智能云文本转语音(实测)
  • 《Pandas1.x实例精解 》书籍分享
  • Linux多核飞控
  • 利用ElementUI配置商品的规格参数
  • ROS-ROS通信机制-服务通信
  • 前端面试提问(3)
  • nodejs微信小程序+python+PHP本科生优秀作业交流网站的设计与实现-计算机毕业设计推荐
  • HMM(Hidden Markov Model)详解——语音信号处理学习(三)(选修一)
  • OWASP安全练习靶场juice shop-更新中
  • dante(centos)安装
  • vue3安装markdown-it
  • STM32F1外部中断EXTI
  • webpack学习-2.管理资源
  • YOLOv8创新魔改教程(三)如何添加注意力机制注意力机制的用法与思考
  • C# 雪花算法生成Id工具类
  • 界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)
  • [英语学习][8][Word Power Made Easy]的精读与翻译优化
  • _WorldSpaceLightPos0的含义 UNITY SHADER
  • vue3 学习
  • 伯俊软件CTO陈雨陆:R3全渠道业务中台的OceanBase落地实践
  • 力扣295. 数据流的中位数