C语言函数指针之回调函数

1、为什么需要函数指针

见下面的回调函数的使用,由于本人才疏学浅,不想误导大家,大家可以参考其它的资料,望谅解。

2、什么是函数指针

首先它是一个指针变量,变量的类型是函数的指针,也就是函数的地址,也就是说函数指针是一个用来保存函数地址的变量,因为它只是一个指针变量,只不过这个指针变量保存的不是普通的数据类型变量的地址,而是函数的地址
在C语言中,函数名就是函数的入口地址

3、函数指针的定义

int (* fp)(int , int y);

fp是函数指针的变量
int (*)(int, int)是这个指针变量的数据类型
要注意(*p)是不可以省略的,不然就定义了一个指针函数,注意这两个概念的区别,一个是保存函数地址的指针变量,一个是含有指针类型的函数,区别还是蛮大的。

3.1函数指针的特性

  • 参数的个数必须要和返回值类型的函数的原型一致
  • 形参的数据类型也要一致
  • 返回值类型也必须一样
    形如:在定义函数指针的时候后面的形参也可以和函数声明一样,不用写具体的形参变量
int (*PonterFunc)(int, int);
int sum(int x, int y) { return x + y;}

4、函数指针的用途–回调函数

关于回调函数,为什么要使用回调函数,由于我个人实在是太业余了,怕误导大家,所以就简单说一下
仔细观察下面的代码会发现一个共同点,
1.1.他们都有一个共同的返回值类型int
2.2.都是两个参数,并且两个参数的类型相同
假如现在客户有一个需要,需要的是两个结果的和,但是这一段时间后,他又需要获得这两个数中的最大值或者是最小值(当然实际应用中,肯定不会有这么二的需求),这个时候你是选择修改源代码还是,修改源代码肯定是不合适的,所以这个时候函数指针就上场了,你可以先把客户可能的需要先提前作好判断,如下

int sum(int x, int y){ return x + y;}
int max(int x, int y){ return x + y;}
int getMaxValue(int x, int y){return x>y ? x : y}
... ...
typedef int (* PFUN)(int, int);
int sum(int x, int y){ return x + y;}
int minus(int x, int y){ return x + y;}
int getMaxValue(int x, int y){return x>y ? x : y}
... ...
int getValue(int x, int y, PFUN p)
{
    return p(x, y);
}
int a, b, c, x, y;
a = b = c = x = y = 0;

printf("sum: %d\n", getValue(100, 200, sum));
printf("sum: %d\n", getValue(100, 200, minus));
printf("sum: %d\n", getValue(100, 200, getMaxValue));

5、函数指针的用途,回调函数参考示例

#include <stdio.h>

int sum(int x, int y);
int getMaxVal(int x, int );
int getMinus(int x, int y);
typedef int(* PFUN)(int x, int y);
int getValue(int, int, PFUN);

int sum(int x, int y)
{
    return x + y;
}

int getMaxVal(int x, int y)
{
    return x>y ? x : y;
}

int getMinus(int x, int y)
{
    return x - y;
}

//Define a call function
int getValue(int x, int y, PFUN p)
{
    return p(x, y);
}

int main(void)
{
    int x, y;

    //Define a pointer variable, The return type is same as the sum function, NOT int.
    //The pf is the pointer function variable
    //int (*)(int x, int y) is the return type.
    int (* pf)(int x, int y);
    //pf = sum;

    PFUN p = sum;

    x = 100;
    y = 200;

    printf("The sum result is: %d\n", sum(x, y));
    //printf("The sum result is: %d\n", pf(x, y));
    printf("The sum result is: %d\n", p(x, y));
    //Test the call back function
    printf("The call back function test result: sum\t\t -->\t%d\n", getValue(300, 200, sum));
    printf("The call back function test result: getMinus\t -->\t%d\n", getValue(300, 200, getMinus));
    printf("The call back function test result: getMaxVal\t -->\t%d\n", getValue(300, 200, getMaxVal));

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值