int maxValue(int x,int y)
{ return x > y ? x : y;}void printHello(){ printf("hello\n");}int max(int x,int y){ return x < y ? x : y;}int sum(int x,int y){ return x + y;}int getValue(int x,int y,int (*p)(int ,int )){ // p是函数指针,具体指向一个函数,由调用函数时传入的函数名决定 int r = p(x,y); return r;}int main(int argc, const char * argv[]) { #pragma mark --------------------函数指针--------------------/* 函数: 实现某种特定功能的代码 程序编译时,系统会将函数代码分配在代码区,这段存储空间的起始地址就是函数的地址.又称 函数的指针 函数名和数字名一样是地址 // 通过函数名调用函数 printf("%d ",maxValue(3,5)); 函数指针: 指向函数的指针.可以通过函数指针调用指向的函数 定义函数指针指向maxValue函数 指针类型必须与指向的数据的类型匹配,函数有类型,函数指针必须和函数的类型保持一致 maxValue函数的类型 int(int,int) 返回值类型 (*函数指针名)(参数类型) = 函数名 int (*p)(int x,int y) = maxValue; printf("%d ",p(30,50)); // 函数指针类型:返回值类型 (*)(参数类型) 例如: int (*)(int x ,int y); // 练习: void printHello(); 定义一个可以指向上述函数的函数指针,并通过函数指针实现调用该函数 void (*p)() = printHello; p(); // 练习 定义两个函数,⼀一个求最⼤大值,⼀一个求和,输⼊入max或sum分别求3,5的 最⼤大值或和(提⽰示,定义⼀一个函数指针,根据输⼊入内容指向不同函数,最后 ⼀一次调⽤用完成) char a[5] = {0}; scanf("%s",a); if (strcmp(a, "sum") == 0) { int (*p)(int x,int y) = sum; printf("%d ",p(3,5)); } if (strcmp(a, "max") == 0) { int (*p)(int x,int y) = max; printf("%d ",p(3,5)); } printf("\n");*/#pragma mark --------------回调函数------------------/* //函数指针作为函数参数 int (*p)(int ,int ) = max; int (*q)(int ,int ) = sum; int max1 = getValue(3, 5, p); int sum2 = getValue(3, 5, q); printf("%d %d\n",max1,sum2); 回调过程: 在getValue执行的过程中,体内各国传入的函数指针,调用执行某个函数 回调函数: 在函数执行过程中.通过函数指针被调用的函数 函数回调: 调用回调函数的操作*/// 练习 写⼀一函数查找成绩90分以上的学员,使⽤回调函数在姓名后加”⾼富帅”。/* Student stu1[3] = { {1,"zhangsan",84.0}, {2,"lisi",59.0}, {3,"wangwu",96.0} }; Student *p = stu1; findstudentScorechengji(p);*//* Student stu1 = {"wukong", 'm', 500, 60.0}; Student stu2 = {"zixia", 'w', 18, 98.0}; Student stu3 = {"sanzang", 'w', 40, 100.0}; Student stu4 = {"longma", 'w', 27, 93.0}; Student stu5 = {"bajie", 'w', 300, 59.0}; Student stus[5] = {stu1, stu2, stu3, stu4, stu5}; // 定义一个函数指针,指向拼接字符串函数 void (*p)(char*) = addStr; findStudentByScore(stus, 5, p); printAllStudent(stus, 5);*/ #pragma mark ----------动态排序-------------- // 排序: 排序的规则不同,年龄,姓名,成绩,升序,降序 //利用回调函数实现动态排序 Student stu1 = {"wukong", 'm', 500, 60.0}; Student stu2 = {"zixia", 'w', 18, 98.0}; Student stu3 = {"sanzang", 'w', 40, 100.0}; Student stu4 = {"longma", 'w', 27, 93.0}; Student stu5 = {"bajie", 'w', 300, 59.0}; Student stus[5] = {stu1, stu2, stu3, stu4, stu5};// printf("按姓名排序\n");// sortStudentByName(stus,5);// AllStudent(stus,5);// printf("按分数排序\n");// sortStudentByScore(stus,5);// AllStudent(stus,5);// printf("按年龄排序\n");// sortStudentByAge(stus,5);// AllStudent(stus,5);// printf("新玩法\n");// printf("按姓名排序\n");// sortStudent(stus,5,compartStudentByName);// AllStudent(stus,5);// printf("按分数排序\n");// sortStudent(stus,5,compartStudentByScore);// AllStudent(stus,5);// printf("按年龄排序\n");// sortStudent(stus,5,compartStudentByNAge);// AllStudent(stus,5); #pragma mark ------------函数的返回值是函数的指针--------------
m.h
typedef struct
{ char name[30]; char sex; int age; float score;}Student;void findstudentScorechengji(Student *p);// 根据名字大小排序void sortStudentByName(Student *stus,int count);//根据分数排void sortStudentByScore(Student *stus,int count);//根据年龄排void sortStudentByAge(Student *stus,int count);//遍历输出void AllStudent(Student *stus,int count);// 新玩法typedef BOOL (*SORT)(Student,Student);//SORT代表的是一个类型函数指针,指向的函数的返回值是BOOL类型,参数是俩个Student变量//实现排序函数void sortStudent(Student *stus,int count,SORT p_sort);BOOL compartStudentByName(Student stu1,Student stu2);BOOL compartStudentByScore(Student stu1,Student stu2);BOOL compartStudentByNAge(Student stu1,Student stu2);m.m
/*
void findstudentScorechengji(Student *p){ for (int i = 0; i < 3; i ++) { if ((p + i) -> score > 90) { strcat((p + i) -> name, "高富帅"); printf("%d %s %.1f\n",(p + i) -> num,(p+i) -> name,(p + i) -> score); } }}*//*void findStudentByScore(Student *stus,int count,void (*p)(char *)){ for (int i = 0; i < count;i++) { if (stus[i].score > 90) { p(stus[i].name);//函数回调 } }}void printAllStudent(Student *stus,int count){ for (int i = 0; i < count; i++) { printf("name = %s, sex = %c, age = %d, score = %.2f\n",stus[i].name,stus[i].sex,stus[i].age,stus[i].score); } }*/// 根据名字大小排序void sortStudentByName(Student *stus,int count){ for (int i = 0; i < count - 1; i ++) { for (int j = 0; j < count - 1 - i; j ++) { if (strcmp(stus[j].name,stus[j+1].name )) { Student temp = stus[j]; stus[j] = stus[j + 1]; stus[j + 1] = temp; } } }}//根据分数排void sortStudentByScore(Student *stus,int count){ for (int i = 0; i < count - 1; i ++) { for (int j = 0; j < count - 1 - i; j ++) { if (stus[j].score > stus[j+1].score) { Student temp = stus[j]; stus[j] = stus[j + 1]; stus[j + 1] = temp; } } }}//根据年龄排void sortStudentByAge(Student *stus,int count){ for (int i = 0; i < count - 1; i ++) { for (int j = 0; j < count - 1 - i; j ++) { if (stus[j].age > stus[j+1].age) { Student temp = stus[j]; stus[j] = stus[j + 1]; stus[j + 1] = temp; } } }}//遍历输出void AllStudent(Student *stus,int count){ for (int i = 0; i < count; i++) { printf("name:%s sex:%c age:%d score:%.1f\n",stus[i].name,stus[i].sex,stus[i].age,stus[i].score); } }//实现排序函数void sortStudent(Student *stus,int count,SORT p_sort){ for (int i = 0; i < count - 1; i ++) { for (int j = 0; j < count -i - 1; j ++) { if (p_sort(stus[j],stus[j+1])) { Student temp = stus[j]; stus[j] = stus[j+1]; stus[j+1] = temp; } } }}BOOL compartStudentByName(Student stu1,Student stu2){ return strcmp(stu1.name, stu2.name) > 0;}BOOL compartStudentByScore(Student stu1,Student stu2){ return stu1.score > stu2.score; }BOOL compartStudentByNAge(Student stu1,Student stu2){ return stu1.age > stu2.age;}