直接上例子,这个调用函数指针还是比较好理解的。
/* 《嗨翻C语言》随书练习 7章 高级函数 2016-12-06 xiousheng@126.com 寻找真命天子例子 */ #include <stdio.h> #include <stdlib.h> int NUM_ADS = 7; char *ADS[] = { "王小华:喜欢体育,电视 美食", "周星星:喜欢艺术、电影、戏曲", "邓小斗:喜欢骑马,射击,读书,画画", "张大山:喜欢书籍,戏曲,睡懒觉,体育", "习大华:喜欢游泳,画画,园艺", "中三郎:喜欢美食,美女,小黄书,体育" , "江坑爹:喜欢美女,音乐,体育" }; //两个搜索条件函数 int sport_no_huangshu(char *s){ return strstr(s,"体育")&& !strstr(s,"小黄书") ; } int meisi_no_lanjiao(char *s){ return strstr(s,"美食")&& !strstr(s,"睡懒觉") ; } //其实这里有点高级语言的回调函数的意思 void find(int (*match)(char*)){ //调用函数指针 int i; puts("寻找我的真命天子:"); puts("------------------------------------"); for(i=0;i<NUM_ADS;i++){ if(match(ADS[i])){ printf("符合条件的是%s\r\n",ADS[i]); } } } int main(){ find(sport_no_huangshu); find(meisi_no_lanjiao); return 0; }
调用排序函数的小例子
/* 《嗨翻C语言》随书练习 7章 高级函数 2016-12-08 xiousheng@126.com 排序算法 */ #include <stdio.h> #include <stdlib.h> #include <string.h> //按升序排列整形得分 int compare_scores(const void* score_a, const void* score_b){ int a = *(int*)score_a; int b = *(int*)score_b; return a - b; }; //按降序排列整形得分 int compare_scores_desc(const void* score_a, const void* score_b){ int a = *(int*)score_a; int b = *(int*)score_b; return b - a; }; //按面积从小到大排列矩形 //先定义矩形结构体 typedef struct{ int width; int height; } rectangle; int compare_areas(const void* a, const void* b){ rectangle * za = (rectangle*)a; //因为void* 指针可以表示任意类型,这里先转换为矩形结构体型 rectangle * zb = (rectangle*)b; int areas_a = (za->height)*(za->width); //计算各自面积 int areas_b = (zb->height)*(zb->width); return areas_a - areas_b; }; //按字目序排列名字,区分大小写 int compare_names(const char* a, const char* b){ char** sa = (char**)a; //字符串是字符指针,所以我们这里得到的是指针的指针 char** sb = (char**)b; return strcmp(*sa, *sb); } //库里面自带排序函数,参数(数组指针,数组长度,数组中每个元素长度,真正用于排序计算的函数指针(参数a,b)) //qsort(void *array, size_t length, size_t item_size, int(*compar)(const void *, const void *)); //void* 指针可以指向任意数据类型 int main(){ //按数字排序 int scores[] = { 543, 321, 223, 345, 678, 993, 876 }; qsort(scores, 7, sizeof(int), compare_scores_desc); puts("看看排序结果"); for (int i = 0; i < 7; i++){ printf("%i ", scores[i]); }; printf("\r\n"); //按字符排序 char *names[] = { "习近平", "李克强", "江泽民", "温家宝" }; //字符串指针数组 qsort(names, 4, sizeof(char*), compare_names); puts("看看排序结果"); for (int i = 0; i < 4; i++){ printf("%s ", names[i]); }; system("PAUSE "); return 0; }