首页 > 其他 > 详细

函数指针第一节

时间:2014-03-19 11:43:57      阅读:517      评论:0      收藏:0      [点我收藏+]

本节课主要内容:
函数回调

函数指针的定义与函数声明很相似,将函数定义中的函数名改为(*p),就得到了函数指针。

函数声明:
int maxValue(int x,int y);

函数指针的定义:
int (*p)(int x, int y);
p为函数指针变量

例程:
通常情况下,我们写一个返回两数之中较大的一个的函数这样写:

 

bubuko.com,布布扣
 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     }
bubuko.com,布布扣

程序输出:
5

我们把maxValue这个函数改写成使用函数指针来调用,初步可以写成这样:

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

 



程序输出:
5

进一步修改,我们可以把int (*p)(int,int) 看成是int (*)(int,int) p,采用typedef修改成:

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

 


程序输出:
5

最终,可以修改成:

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

 


程序输出:
5

需要注意的是,函数指针的类型需要与它指向的函数的返回类型一致。
我们称例中的getValue函数为回调函数,回调函数的核心是函数指针作为参数。

回调函数练习:
把下面的程序改成使用回调函数的方式:

bubuko.com,布布扣
 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 }
bubuko.com,布布扣

思考题:

学生结构体数组,按照成绩排序、按照年龄排序、按照名字排序……怎么实现?

函数指针第一节,布布扣,bubuko.com

函数指针第一节

原文:http://www.cnblogs.com/jimwang/p/3610628.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!