函数指针是定义一个指针指向函数的首地址,并可以调用

#include <stdio.h>

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

int main(void)
{
    int (*p)(int ,int) = &max;
    int a, b, c, d;
    printf("input three num: \n");
    scanf("%d %d %d", &a, &b, &c);
    d = p(p(a,b),c);
    printf("&max addr is %d\n",&max);
    printf("max addr is %d\n",max);
    printf("p addr is %d\n",p);
    printf("&p addr is %d\n",&p);
    printf("max num : %d \n",d);
    return 0;
}

 从运行结果可以发现 函数指针指向了 max ,这样就可以调用max

可以注意到 函数max &max 和 p 指向的地址都是一样的 注意p的地址和他们不一样 p存储的是max地址或者说指向max地址

#include <stdio.h>

typedef int (*PFUN)(int,int);

int max(int a,int b)
{
    return a > b ? a : b;
}

int main()
{
    PFUN pfun;
    pfun = max;
    int result = pfun(3,4);
    printf("result : %d\n",result);
}

最后结果为4 用typedef 就定义了这种类型的函数指针 类似于结构体定义 这样可以通过PFUN来定义这种类型的函数指针

那么它的应用 可以见下面的例子:

#include <stdio.h>

typedef int (*FP_CALC)(int,int);  // 定义一个函数指针类型 FP_CALC

int add(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{
    return a-b;
}

int mul(int a, int b)
{
    return a*b;
}

int div(int a, int b)
{
    return b ? a/b : -1;
}

// 定义一个函数 返回值为 FP_CALC   其中 add sub mul div 函数头其实都是函数的开始地址 也就是可以看作函数指针 
// 通过'+ - * /' 来判断返回哪个函数指针 进行调用
FP_CALC calc_func(char op)
{
    switch(op)
    {
            case '+':
                return add;
            case '-':
                return sub;
            case '*':
                return mul;
            case '/':
                return div;
            default:
                return NULL;
    }
}

//     定义计算函数,通过判断传的是什么符号 调用什么运算

int calc(int a, int b, char op)
{
    FP_CALC func;
    func = calc_func(op);
    return func(a,b);
}

void main()
{
    int a = 100, b = 20;
    
    printf("a + b = %d\n",calc(a,b,'+'));
    printf("a - b = %d\n",calc(a,b,'-'));
    printf("a * b = %d\n",calc(a,b,'*'));
    printf("a / b = %d\n",calc(a,b,'/'));
}

 

posted on 2022-01-05 17:17  Rabbit_XIN  阅读(34)  评论(0)    收藏  举报