- C语言中的函数指针
在C语言中,函数指针是指向函数的指针,它的声明和变量指针一样,但是它指向的是函数,而不是普通的变量。C语言中的函数指针定义格式如下:
返回类型 (*函数指针名称)(参数列表);
其中返回类型为函数返回值类型,函数指针名称为指针名称,参数列表为函数参数列表。例如,下面是一个简单的函数指针定义:
int (* pFunc)(int a, int b);
它指向一个函数,该函数有两个整型参数 a 和 b,返回值为整型。
- 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,最终打印出了计算结果。
- 另一个函数指针回调的示例
下面再给出一个函数指针回调的示例,演示学生成绩排序的功能:
#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 函数指针作为参数,表示按照该函数定义的规则来进行排序。最终打印出的排序结果,按照学生的成绩由低到高排序。