【C语言】函数指针的应用

目录

1. 函数指针介绍

1.1 函数指针的声明

1.2 对函数进行注册

2. 函数指针的优势

3. 函数指针应用场景

3.1 函数指针作为结构体成员

3.2 函数指针作为函数参数


1. 函数指针介绍

        顾名思义,函数指针是指向函数的指针,而被函数指针指向的函数又被称为回调函数。函数指针的使用步骤共分为两步,函数指针的声明和回调函数的注册。

1.1 函数指针的声明

        下面这个用例声明了一个函数指针,函数指针名为ptr,指向的函数返回值类型为BOOL,函数参数一共有两个,一个是int类型的para1,另外一个是char类型的para2。

//函数指针的声明
 BOOL  *ptr (int para1, char para2);

1.2 对函数进行注册

        对函数进行注册的操作实际上就是将函数指针指向回调函数,从而达到间接调用函数的效果,下面的用例就先声明一个函数指针,然后将函数指针指向回调函数,造成的效果和直接调用函数是一致的。

//函数指针的声明
BOOL  *ptr (int* para1, int* para2);

/*数值交换函数*/
BOOL swap_value(int *a, int *b)
{
    if((NULL == a) || (NULL == b))
    {
        return FALSE;
    }
    
    int temp = *a;
    *a = *b;
    *b = temp;
    
    return TRUE;
}


int a = 5;
int b = 10;

//注册函数
p =  swap_value(&a, &b);

2. 函数指针的优势

 (1)灵活度更高:函数指针的灵活性更高,体现在我们可以在需要的时候再对函数进行注册,比如说在私有代码中定义函数指针,这个函数指针可以针对不同的情况指向不同的公共库中的函数,从而更加灵活地实现调用库函数。

 (2)可读性更好:函数指针使得代码的可读性更好,例如可以通过将所有的初始化接口被结构体成员中的函数指针注册的方式,将所有的初始化流程都集中在一张表上,从而使得可读性和可为维护性更好。

3. 函数指针应用场景

        在C语言中,函数指针常见的应用有两种,其一是函数指针作为结构体成员,其二是函数指针作为函数参数,下面两个用例说明了这两张情况。

3.1 函数指针作为结构体成员

(1)功能背景:

        在一个嵌入式系统中,我们期望通过读取系统的逻辑ID来选择不同的方案。逻辑ID为0时,通过Config_para_by_method1函数来配置参数。逻辑ID为1时,通过Config_para_by_method2函数来配置参数,以此类推。

(2)方案设计:

        这里最容易想到的是使用if判断语句,判断系统的逻辑ID并配置对应的接口函数。但是这样造成两个问题,一个是当方案数量变多时,代码的圈复杂度过高,难以维护。其次是代码的可读性会变得非常差。

        因此我们在这里可以使用函数指针的方案,让函数指针成为结构体成员,让配置函数成为结构体类型的二维数组参数,让其进行注册从而达到把所有的配置函数都写在一张表的效果。在后续操作时,只需要遍历二维数组中的logicID,找到对应的行并且配置对应的回调函数即可。这样大大提高了代码的可维护性和可读性。

#define MAX_LINE sizeof(struct ConfigPara) 

//函数指针作为结构体成员
struct ConfigPara
{
    unsingned logicId;        //逻辑ID
    char describe[10];    //描述符
    int  *pConfigPara(unsigned char logicId);  //配置方案
}

//读取当前系统的逻辑ID
unsingned int g_logicId = get_logicID();

//定义结构体变量时注册对应函数
struct ConfigPara g_arr[][MAX_LINE] = {
{ 0, "方案1", Config_para_by_method1}
{ 1, "方案2", Config_para_by_method2}
{ 2, "方案3", Config_para_by_method3}
{ 3, "方案4", Config_para_by_method4}};

//方案配置
for(int index = 0, index < sizeof(g_arr)/sizeof(g_arr[0]), index ++)
{
    if(g_logicId == g_arr[index].logicId)
    {
        g_arr[index]->pConfigPara(g_arr[index].logicId);
    }
}

3.2 函数指针作为函数参数

        函数指针还可以作为函数参数来传递,这个应用比较简单,比如C标准库中的快速排序函数qsort就是使用了函数指针。

//C标准库快速排序函数定义
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中有两个相关概念,函数指针和指针函数。 1. 函数指针(Function Pointers):函数指针是指向函数的指针变量。它可以用来存储和调用特定类型的函数。通过函数指针,可以在运行时动态地选择要执行的函数。函数指针的声明形式为:`返回类型 (*指针变量名)(参数列表)`。例如,以下是一个函数指针的示例: ```c #include <stdio.h> void display(int num) { printf("Number: %d\n", num); } int main() { void (*func_ptr)(int); // 声明一个函数指针变量 func_ptr = display; // 将函数的地址赋值给函数指针变量 func_ptr(10); // 通过函数指针调用函数 return 0; } ``` 2. 指针函数(Pointer to a Function):指针函数是一个返回指向函数的指针的函数。它返回的是函数的地址,而不是函数的返回值。指针函数的声明形式为:`返回类型 (*函数名)(参数列表)`。以下是一个指针函数的示例: ```c #include <stdio.h> int add(int num1, int num2) { return num1 + num2; } int subtract(int num1, int num2) { return num1 - num2; } int (*getOperation(char op))(int, int) { if (op == '+') { return add; // 返回add函数的地址 } else { return subtract; // 返回subtract函数的地址 } } int main() { int num1 = 10, num2 = 5; char op = '+'; int (*operation)(int, int); // 声明一个指针函数变量 operation = getOperation(op); // 将指针函数的返回值(函数地址)赋值给指针函数变量 int result = operation(num1, num2); // 通过指针函数调用对应的函数 printf("Result: %d\n", result); return 0; } ``` 以上就是函数指针和指针函数的基本概念和用法。通过它们,可以实现更灵活的函数调用和动态选择执行的函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电脑玩家饮水机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值