直接上例子,这个调用函数指针还是比较好理解的。
/* 《嗨翻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;
}