user-0 提问: 可以给几个函数指针的应用场景吗？

回复:
user: user-1
content: ﻿//////////////////////////////////////////////////////////////////////// //文件名: void_pointer.c //作者: cfjtaishan //日期: 2013-03-21 //描述: 泛型函数指针的运用. //说明: //    1. 实现了整型数组的求最大元素和字符串数组汇总求最大的字串; //    2. 实现了对整型数组和字符串数组进行冒泡排序; ////////////////////////////////////////////////////////////////////////  #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>  //这两个宏用于作为编译开关 #define INTEGE #define STRING   #define LEN 10 #define DAYS 7  //声明泛型函数指针 typedef int (*pfunc)(const void *, const void *); typedef void (*fswap)(void *, void *);  //函数声明 int compare_intege(const void *a, const void *b); int compare_string(const void *a, const void *b); void swap_for_intege(void *p, void *q); void swap_for_string(void *p, void *q); void *my_max(void *pbuf, const int len, const int size, pfunc cmp); void bubble_sort(void *pbuf, const int len, const int size, pfunc cmp, fswap swap); void initize_arr(int *arr, const int len); void show_arr(const int *arr, const int len);  int main(int argc, char *argv[]) { #ifdef INTEGE     int arr[LEN], *max;     initize_arr(arr, LEN);     printf("Show the arr arguments: \n");     show_arr(arr, LEN);     max = (int *)my_max(arr, LEN, sizeof(int), compare_intege);     printf("Max integer is %d\n", *max);     bubble_sort(arr, LEN, sizeof(int), compare_intege, swap_for_intege);     printf("After sort: \n");     show_arr(arr, LEN); #endif  #ifdef STRING     int i;     char *week[DAYS] =     { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};     char **max_str = (char **)my_max(week, DAYS, 4, compare_string);    //指针长度为4 	printf("--------------------------------------------------------------\n"); 	printf("Max string is ");     puts(*max_str);     bubble_sort(week, DAYS, 4, compare_string, swap_for_string);    //指针长度为4     printf("After bubble sort: \n");      for (i = 0; i < DAYS; i++)     {         printf("%s  ", week[i]);     }     putchar('\n'); #endif      return 0; }  ////////////////////////////////////////////////////////////////////////// // 函数名: initize_arr // 描述 : 初始化数组。 // 参数: //    [in/out] arr -- 整型数组的首地址; //    [in] len -- 整型数组最大长度; // 返回值: 无。 // 说明: ////////////////////////////////////////////////////////////////////////// void initize_arr(int *arr, const int len) {     int i;     srand(time(NULL));      for (i = 0; i < len; i++)     {         arr[i] = rand() % 1000;    //产生1000以内的随机数     } }  ////////////////////////////////////////////////////////////////////////// // 函数名: show_arr // 描述 : 打印数组元素值。 // 参数: //    [in] arr -- 整型数组的首地址; //    [in] len -- 整型数组最大长度; // 返回值: 无。 // 说明: ////////////////////////////////////////////////////////////////////////// void show_arr(const int *arr, const int len) {     int i;      for (i = 0; i < len; i++)     {         printf("%d  ", arr[i]);     }     putchar('\n'); }  ////////////////////////////////////////////////////////////////////////// // 函数名: compare_intege // 描述 : 比较两个整数的大小。 // 参数: //    [in] a -- 一个整型数据的地址; //    [in] b -- 另一个整型数据的地址; // 返回值: //    若*a > *b，则返回正整数； //    若*a == *b 则返回0； //    若*a < *b，则返回负正整数; // 说明: ////////////////////////////////////////////////////////////////////////// int compare_intege(const void *a, const void *b) {     return *(int*)a - *(int *)b; }  ////////////////////////////////////////////////////////////////////////// // 函数名: compare_string // 描述 : 比较两个字符串的大小。 // 参数: //    [in] a -- 一个字符串的地址; //    [in] b -- 另一个字符串的地址; // 返回值: //    和strcmp的返回相同. // 说明: ////////////////////////////////////////////////////////////////////////// int compare_string(const void *a, const void *b) {     return strcmp(*(char **)a, *(char **)b); }  ////////////////////////////////////////////////////////////////////////// // 函数名: my_max // 描述 : 求数据集中的最大值。 // 参数: //    [in/out] pbuf -- 泛型数据的首地址; //    [in] len -- 泛型数据的最大长度; //    [in] size -- 泛型数据的长度; //    [in] cmp -- 回调函数; // 返回值: //    最大数据的首地址. // 说明: ////////////////////////////////////////////////////////////////////////// void *my_max(void *pbuf, const int len, const int size, pfunc cmp) {     char *max = pbuf;     int i;     for (i = 0; i < len; i++)     {         if (cmp(max, pbuf + i * size) < 0)         {             max = pbuf + i * size;         }     }      return max; }  ////////////////////////////////////////////////////////////////////////// // 函数名: bubble_sort // 描述 : 冒泡排序。 // 参数: //    [in/out] pbuf -- 泛型数据的首地址; //    [in] len -- 泛型数据的最大长度; //    [in] size -- 泛型数据的长度; //    [in] cmp -- 回调函数; //    [in] swap -- 回调函数; // 返回值: 无. // 说明: ////////////////////////////////////////////////////////////////////////// void bubble_sort(void *pbuf, const int len, const int size, pfunc cmp, fswap swap) {     int i, j;      for (i = 0; i < len - 1; i++)     {         for (j = 0; j < len - i -1; j++)         {             if (cmp(pbuf + j * size, pbuf + (j + 1) * size) > 0)             {                 swap(pbuf + j * size, pbuf + (j + 1) * size);             }         }     } }  ////////////////////////////////////////////////////////////////////////// // 函数名: swap_for_intege // 描述 : 交换两个数据。 // 参数: //    [in] p -- 一个整型数据的地址; //    [in] q -- 另一个整型数据的地址; // 返回值: 无. // 说明: ////////////////////////////////////////////////////////////////////////// void swap_for_intege(void *p, void *q) {     int tmp;     tmp = *(int*)p;     *(int *)p = *(int *)q;     *(int *)q = tmp; }  ////////////////////////////////////////////////////////////////////////// // 函数名: swap_for_string // 描述 : 交换两个数据。 // 参数: //    [in] p -- 一个字符串的地址; //    [in] q -- 另一个字符串的地址; // 返回值: 无. // 说明: ////////////////////////////////////////////////////////////////////////// void swap_for_string(void *p, void *q) {     char *str;     str = *(char **)p;     *(char **)p = *(char **)q;     *(char **)q = str; }  函数指针的例子，供参考～

user: user-2
content: 回调函数，一般框架里会大量用的。  举几个例子 比如，你用智能指针shared_ptr 是可以自定义删除器的，这个删除器就是个函数指针  还有集合排序的时候，指定比较器，也可用函数指针  再比如，libevent里面就使用了大量的回调函数技术，很多关键的函数比如evconnlistener_new_bind的参数都有函数指针类型的。

user: user-3
content: windows系统开发的时候，很多的回调函数都函数指针， callback  很多地方都可以用，就看你怎么设计你的程序了，简单的举两个例子： 比如， 菜单命令， if（ 用户输入 == 1 ） fun1（） else if（用户输入==2） fun2（） 这些命令很像是不是 那么我们可以建立一个函数指针的数组， 比如 void （*funcs[10])(void); funcs[0] =fun1; funcs[1]=fun2; .... 菜单命令就可以直接   funcs[用户输入]； 不用一堆if else了， 主要先检测一下用户输入的是有效数字   其二 二叉树，经常会用， 遍历有不同的方法， 中序，先序，后序；  不管那种方法，你都需要在每个节点上进行操作 也许不通的情况下，需要不同的操作， 怎么办呢， 写一堆重复的函数吗 不用， 写一个通用的遍历，然后在每个节点上调用函数指针完成不同的任务 更常见的sort函数里面的cmp函数指针就是类似的情况   总之，就是类似的控制流程下， 不同的操作； 都可以把这些操作换成不同的函数指针来执行，那么控制流程就一个就好了  慢慢体会吧， 应用做多了， 自然就遇到了