十六、函数指针初级(函数指针与函数调用)

1.函数指针
①函数在内存中也是有地址的。函数名代表函数的内存地址
②函数指针是指向函数的指针变量
③函数存放在代码区
④函数指针定义与函数声明很相似
函数声明:int maxValue(int x , int y);
函数指针定义:int (*p)(int x , int y);
⑥函数指针剖析
int (*p)(int x , int y)
变量定义三部分:
类型:int (*)(int x , int y)
变量名:p
初值:NULL
⑦函数的地址已经固定了,但是指针变量的地址可以来回改变
⑧函数指针定义
《1》通常使用typedef来定义函数指针类型
《2》typedef int(*PFUN)(int x , int y);//形参可以省略
《3》PFUN是typedef后的新类型名
《4》PFUN p = NULL;
《5》类型 变量 初值
⑨函数指针赋值
《1》p = maxValue;//之后p可以当maxValue用
《2》函数名代表函数的入口地址
《3》给函数指针赋值的函数,应该和函数指针定义的函数原型是一致的
⑩示例:
typedef int(*PFUN)(int , int);
//相当于把int (*)(int , int)改成PFUN
int sum(int a , int b );
int sum(int a , int b ){//加法函数
     return a+b;
}
int maxValue(int x , int y);
int maxValue(int x , int y){//最大值函数
     return x>y?x:y;
}
int main(){
     PFUN p1 = sum;//定义一个指针变量p1,并过去sum地址
     
     int (*p)(int a , int b );
     p = sum;//指针变量p获取sum地址
     
     int x = p(30,20);
     printf(“%d\n”,x);
 
     p = maxValue;//同一类型指针变量可以获得多个函数地址
     printf(“%d”,p(100,30));
}
2.函数回调
①回调函数(callback):回调函数是一个函数,它由调用方自己实现,供被调方调用的函数
②函数回调是一种非常灵活的设计模式,实际应用非常广。
③回调函数 核心 函数指针作为参数
示例:
int revalue(int a , int b , int(*p)(int , int));
使用:
int m = getValue(3,5,maxValue);//m是5
④示例:
typedef int(*PFUN)(int , int);
//相当于把int (*)(int , int)改成PFUN
int sum(int a , int b );
int sum(int a , int b ){//加法函数
     return a+b;
}
int maxValue(int x , int y);
int maxValue(int x , int y){//最大值函数
     return x>y?x:y;
}
int minus(int x , int y);
int minus(int x , int y){//减法函数
     return x-y;
}
int getValue(int x , int y , PFUN p);
int getValue(int x , int y , PFUN p){//回调函数
     return p(x , y);
}
int main(){
     int a = getValue(10 , 20 , maxValue);//求最大值
     int b = getValue(100 , 50 , sum);//求和
     int c = getValue(40 , 5 , minus);//求减
     printf(“%d %d %d\n”,a,b,c);
}
posted @ 2016-01-30 11:09  哎呦,金毛  阅读(325)  评论(0编辑  收藏  举报