//
// main.m
// C10 函数指针-1
//
// Created by 康亮亮 on 15/10/20.
// Copyright (c) 2015年 Darling.com. All rights reserved.
//
#import <Foundation/Foundation.h>
int getValue(int a, int b, int (*p)(int, int)){
// 通过函数传递进来的函数首地址,使用指针的方式调用其他函数
int result = p(a, b);
return result;
}
int maxValue(int a, int b){
return a > b ? a : b;
}
int sum(int a, int b){
int sum = a + b;
return sum;
}
void printHello(){
printf("Hello, everyone!\n");
}
void printBaby(){
printf("AndroidBaby\n");
}
int main(int argc, const char * argv[]) {
#pragma mark 函数指针
/*
* 指向函数的指针,叫做函数指针,函数指针的类型和指向的函数类型一致(函数类型:返回值的类型和参数的个数以及参数的类型)
* 函数名代表的是函数的首地址,所以函数指针可以和函数名混合使用(就像数组名和数组指针一样)
*/
// 定义一个函数指针
// int (*p)(int, int) = NULL; //int (*p)(int a, int b);也可以这样写。为了和函数声明区分开,一般在定义一个函数指针时,省略参数的名字
// p = maxValue;
//
// // 通过函数名来调用函数
// printf("maxValue = %d\n", maxValue(23, 21));
// // 通过指向函数的指针来调用函数。
// printf("maxValue = %d\n", p(23, 21));
// void (*p)() = NULL; //void (*p)(void) = NULL;
// p = printHello;
// p();
//`
// void (*p1)() = NULL;
// p1 = printBaby; // 因为函数printBaby的类型和函数指针p1的类型一致,所以可以用p1指向printBaby;
// p1();
//定义两个函数,⼀个求最⼤值,一个求和,输入max或sum分别求3,5的最大值或和(提示,定义一个函数指针,根据输入内容指向不同函数,最后一次调用完成)。
// int (*p)(int , int) = NULL;
// char name[20];
// printf("请输入maxValue或sum:\n");
// while (p == NULL){
// scanf("%s", name);
// if (strcmp(name, "maxValue") == 0) {
//
// p = maxValue;
// //printf("max = %d", maxValue(4, 8));
//
// }else if(strcmp(name, "sum") == 0){
// p = sum;
// //printf("sum = %d", sum(4, 8));
// }else{
// printf("亲,请输入“maxValue”和“sum”其中一个!!");
// }
//
// }
// if (p != NULL) {
// int result = p(4, 8);
// printf("result = %d\n", result);
// }
#pragma mark 函数回调
/*
函数回调:函数在执行时需要调用另外一个函数,这个过程叫做函数回调(动词)
回调函数: 被调用的那个函数叫做回调函数(名词)
我们可以使用函数指针作为函数的参数,实现函数回调。
*/
// getValue函数将函数的地址(函数地址)作为参数传递进去,这样大大提高了getValue这个函数的灵活性,可以不用修改getValue的代码,就能实现不同的功能。
// 调用getValue函数
// // 1.创建函数指针,并指向其中一个函数
// int (*funcP)(int, int) = maxValue;
// // 2.调用getValue函数,实现求最大数的功能
// int result = getValue(3, 5, funcP);
// printf("result = %d\n", result);
//写一函数查找成绩90分以上的学员,使用回调函数在姓名后加”高富帅”。
return 0;
}