回调函数

 1. 案例分析
   (1)![函数指针做参数](http://img.blog.csdn.net/20151011145212686)
   (2)![函数调用](http://img.blog.csdn.net/20151011145332526)
   (3)![回调过程](http://img.blog.csdn.net/20151011144717577)

2.需求: 控制台输入字符串,根据字符串找到对应的函数,求得 相应的 结果 并返回.
    (1) main.m 文件代码
        while (1) {
        printf("请输入字符串: max --- 求最大值 或者 min --- 求最小值 或者 sum --- 求和");
        char str[20] = {0};
        scanf("%s", str);
        int value = getValueForString(3, 5, str);
        printf("value = %d\n", value);

    }
    (2) Function.m 文件代码
        //函数指针作为函数参数
typedef int(*PFUN)(int x, int y);

//求两个数的最大值
int maxValue(int x, int y);
//求两个数的最小值
int minValue(int x, int y);
//求两个数的和
int sumValue(int x, int y);

//根据字符串求相对应的值.
int getValueForString(int x, int y, char str[]);


//助攻函数  ---  根据字符串返回对应的函数
PFUN getFunctionByString(char str[]);

//声明结构体
struct stringAndFunction {
    char string[20];  //字符串
    PFUN function;    //函数指针
};
typedef struct stringAndFunction StringAndFun;

//分析: 根据需求,要存在对应的表(映射表) -- 结构体数组.这个表只需再 Function.m文件中创建即可, 因为, 外界不关心你本身可以匹配那些函数, 只关心能不能取到某一个值.
    (2) Function.h 文件代码
    //求两个数的最大值
int maxValue(int x, int y) {
    return x > y ? x : y;
}
//求两个数的最小值
int minValue(int x, int y) {
    return x < y ? x : y;
}
//求两个数的和
int sumValue(int x, int y) {
    return x + y;
}


//创建映射表  ---  结构体数组
StringAndFun funPair[] = {
    {"max", maxValue},
    {"min", minValue},
    {"sum", sumValue}
};


//根据字符串求相对应的值.
int getValueForString(int x, int y, char str[]) {
    //根据字符串 str 获取到对应的函数
    PFUN fun = getFunctionByString(str);
    return fun(x, y);
}


//助攻函数  ---  根据字符串返回对应的函数
PFUN getFunctionByString(char str[]) {
    //遍历映射表
    for (int i = 0; i < sizeof(funPair) / sizeof(funPair[0]); i++) {
        //判断, 映射表中是否有符合相应的字符串
        if (strcmp(str, funPair[i].string) == 0) {
            //相等, 代表存在对应的字符串, 因此可以找到对应的函数, 返回该函数即可
            return funPair[i].function;
        }
    }
    return NULL;
//    return maxValue; //此时maxValue函数,作为该函数的的一个默认值进行返回.
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值