本节课主要内容:
函数回调
函数指针的定义与函数声明很相似,将函数定义中的函数名改为(*p),就得到了函数指针。
函数声明:
int maxValue(int x,int y);
函数指针的定义:
int (*p)(int x, int y);
p为函数指针变量
例程:
通常情况下,我们写一个返回两数之中较大的一个的函数这样写:
1 #import <Foundation/Foundation.h> 2 int maxValue( int, int); 3 4 int maxValue( int a, int b){ 5 return a > b ? a : b; 6 } 7 8 int main(int argc, const char * argv[]){ 9 int max = maxValue(3,5);//函数调用 10 printf("%d\n",max); 11 12 return 0; 13 }
程序输出:
5
我们把maxValue这个函数改写成使用函数指针来调用,初步可以写成这样:
1 #import <Foundation/Foundation.h> 2 int maxValue( int, int); 3 int maxValue( int a, int b){ 4 return a > b ? a : b; 5 } 6 7 int main(int argc, const char * argv[]){ 8 int (*p)(int,int) = maxValue; 9 10 int max = p(3,5);//函数指针调用 11 printf("%d\n",max); 12 13 return 0; 14 }
程序输出:
5
进一步修改,我们可以把int (*p)(int,int) 看成是int (*)(int,int)
p,采用typedef修改成:
1 #import <Foundation/Foundation.h> 2 int maxValue( int, int); 3 int maxValue( int a, int b){ 4 return a > b ? a : b; 5 } 6 typedef int(*pFun) (int,int); 7 8 int main(int argc, const char * argv[]){ 9 pFun p = maxValue; 10 11 int max = p(3,5); 12 printf("%d\n",max); 13 14 return 0; 15 }
程序输出:
5
最终,可以修改成:
1 #import <Foundation/Foundation.h> 2 int maxValue( int, int); 3 int maxValue( int a, int b){ 4 return a > b ? a : b; 5 } 6 typedef int(*pFun) (int,int); 7 8 Int getValue(int a, int b, pFun p){ 9 return(a,b); 10 } 11 12 int main(int argc, const char * argv[]){ 13 pFun p = maxValue; 14 15 int max = getValue(3,5,maxValue); 16 printf("%d\n",max); 17 18 return 0; 19 }
程序输出:
5
需要注意的是,函数指针的类型需要与它指向的函数的返回类型一致。
我们称例中的getValue函数为回调函数,回调函数的核心是函数指针作为参数。
回调函数练习:
把下面的程序改成使用回调函数的方式:
1 #import <Foundation/Foundation.h> 2 void changeName( Student * arr, int count); 3 typedef struct student{ 4 float score; 5 char name[50]; 6 }Student; 7 8 void changeName( Student * arr, int count){ 9 for(int i = 0; i < count; i++){ 10 if(arr[i].score > 90){ 11 Strcat(arr[i].name,"Above 90"); 12 } 13 } 14 } 15 16 void printSudent( Student * arr, int count){ 17 for(int i = 0; i < count; i++){ 18 printf("%d,%s",arr[i].score,arr[i].name); 19 } 20 } 21 22 23 int main(int argc, const char * argv[]){ 24 Student stu[5] = { 25 {59.9,"Tom"}, 26 {99.9,"James"}, 27 {91,"Jenny"}, 28 {95,"Bob"}, 29 {89.9,"Jerry"} 30 }; 31 changeName(stu,5); 32 printStudent(stu,5); 33 return 0; 34 }
思考题:
学生结构体数组,按照成绩排序、按照年龄排序、按照名字排序……怎么实现?
原文:http://www.cnblogs.com/jimwang/p/3610628.html