C语言用函数指针支持回调

  • Post category:C
  1. C语言中的函数指针

在C语言中,函数指针是指向函数的指针,它的声明和变量指针一样,但是它指向的是函数,而不是普通的变量。C语言中的函数指针定义格式如下:

返回类型 (*函数指针名称)(参数列表);

其中返回类型为函数返回值类型,函数指针名称为指针名称,参数列表为函数参数列表。例如,下面是一个简单的函数指针定义:

int (* pFunc)(int a, int b);

它指向一个函数,该函数有两个整型参数 a 和 b,返回值为整型。

  1. C语言中函数指针的使用

C语言中函数指针的使用主要是用来支持回调,即将函数作为参数传递给另一个函数,在该函数执行时调用传递进来的函数。回调函数的使用场景很多,例如事件处理、数据结构操作等等。

下面是一个回调函数的示例,演示如何在 C 语言中使用函数指针支持回调:

#include <stdio.h>

// 回调函数
void printNum(int num)
{
    printf("%d\n", num);
}

// 函数指针传递
void calc(int a, int b, void (* pFunc)(int))
{
    int c = a + b;
    pFunc(c);
}

int main()
{
    int a = 2, b = 3;

    // 通过函数指针传递回调函数
    calc(a, b, &printNum);

    return 0;
}

上述示例中,主函数调用了 calc 函数,将 printNum 函数作为参数传递给了 calc 函数,calc 函数在执行过程中调用了传递进来的回调函数 printNum,最终打印出了计算结果。

  1. 另一个函数指针回调的示例

下面再给出一个函数指针回调的示例,演示学生成绩排序的功能:

#include <stdio.h>
#include <stdlib.h>

// 成绩结构体
typedef struct {
    char name[20];
    int score;
} Grade;

// 回调函数,比较学生成绩
int cmpFunc(const void * a, const void * b)
{
    Grade * gradeA = (Grade *)a;
    Grade * gradeB = (Grade *)b;
    return gradeA->score - gradeB->score;
}

// 函数指针传递,排序学生成绩
void sort(Grade * grades, int size, int (* cmp)(const void *, const void *))
{
    qsort(grades, size, sizeof(Grade), cmp);
}

int main()
{
    Grade grades[] = {
        {"Tom", 95},
        {"Jerry", 80},
        {"Mike", 100},
        {"LiLei", 70},
        {"HanMeimei", 85},
    };
    int size = sizeof(grades) / sizeof(grades[0]);

    // 通过函数指针回调排序函数
    sort(grades, size, &cmpFunc);

    // 打印排序后的学生成绩
    for (int i = 0; i < size; i++) {
        printf("%s %d\n", grades[i].name, grades[i].score);
    }

    return 0;
}

上述示例中,cmpFunc 函数用来比较学生成绩,sort 函数用来排序学生成绩,sort 函数的实现中传递了 cmpFunc 函数指针作为参数,表示按照该函数定义的规则来进行排序。最终打印出的排序结果,按照学生的成绩由低到高排序。