C/C++·函数指针

参考书籍:《Pointers in C: A Hands on Approach》

  函数指针,即指向函数地址的变量。通过函数指针可以实现函数调用。函数指针可以实现后期绑定。函数指针的价值主要体现在:统一函数入口以提高函数封装性,回调函数应用,提高函数调用灵活性。

  • 函数指针的定义
    函数指针的定义要根据要指向的函数定义来进行,一般形式:
//1.要指向的函数的声明
<返回类型> 函数名(参数表);
//2.对应的函数指针的声明,返回类型和参数表与要指向的函数声明相同
<返回类型> (*函数指针变量名) (参数表);

举例:

 int Func(int a, int b); //要指向的函数的声明
 int (*Func_ptr)(int a, int b); //对应的函数指针的声明
  • 函数指针的初始化
    函数指针变量初始化有两种方式,两种方式等效:
    -使用取地址操作符: &
    -使用隐含方式赋值: 直接用函数名赋值
    //注意:函数名用不用&都可以,但是普通变量不能如此赋值
    代码示例:
#include <malloc.h>
#include <stdio.h>

void show_num(int num)
{
    printf("The num is %d \n", num);
}

int* add(int x, int y)
{
    int* result = (int*)malloc(sizeof(int));
    *result = x + y;
    return result;
}

int main()
{
    int* result;
    void(*show_num_ptr)(int);
    int* (*add_ptr)(int, int);

    show_num_ptr = &show_num;
    add_ptr = add;

    show_num_ptr(5);
    result = add_ptr(2, 2);
    printf("The result is %d \n", *result);

    return 0;//如果用VS出现闪退,可以按下Ctrl+F5来执行程序
}
  • 函数指针与封装示例
#include <malloc.h>
#include <stdio.h>

void func_a(int num)
{
    printf("func_a: The num is %d \n", num);
}

void func_b(int num)
{
    printf("func_b: The num is %d \n", num);
}

void func_c(int num)
{
    printf("func_c: The num is %d \n", num);
}

void func_(void(*func_ptr)(int), int num)
{
    (*func_ptr)(num);
}

int main()
{
    printf("Input Option: \n");
    printf("1 func_a \n");
    printf("2 func_b \n");
    printf("3 func_c \n");
    printf("4 exit \n");

    int choice = 0;
    int num;
    while (choice != 4) {
        printf("Input\n");
        scanf_s("%d", &choice);
        printf("Num to show\n");
        scanf_s("%d", &num);

        if (choice == 1)
            func_(func_a, num);
        else if (choice == 2)
            func_(func_b, num);
        else if (choice == 3)
            func_(func_c, num);
        else if (choice == 4)
            break;
        else
            continue;
    }

    return 0;
}
  • 函数指针数组
    函数指针数组提供了一种利用数组索引的方式实现函数调用。限制条件:函数具有相同的返回类型,函数参数的数目和类型相同,这些函数可以使用函数指针数组。
//函数指针数组定义
<返回类型> (*函数指针变量[])(参数表)
//函数指针数组示例
#include <malloc.h>
#include <stdio.h>

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

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

int func_mul(int x, int y)
{
    return (x * y);;
}

int func_div(int x, int y)
{
    return (x / y);;
}

int(*func_ptr[])(int x, int y) = {func_add, func_sub, func_mul, func_div};

int main()
{
    printf("Input Option: \n");
    printf("1 func_add \n");
    printf("2 func_sub \n");
    printf("3 func_mul \n");
    printf("4 func_div \n");
    printf("5 exit \n");

    int choice = 0;
    int x, y;
    while (choice != 5) {
        printf("Input:\n");
        scanf_s("%d", &choice);
        printf("Input Nums: x y\n");
        scanf_s("%d %d", &x, &y);

        if (choice == 1)
            printf("The result is : %d \n", func_ptr[0](x, y));
        else if (choice == 2)
            printf("The result is : %d \n", func_ptr[1](x, y));
        else if (choice == 3)
            printf("The result is : %d \n", func_ptr[2](x, y));
        else if (choice == 4)
            printf("The result is : %d \n", func_ptr[3](x, y));
        else if (choice == 5)
            break;
        else
            continue;
    }

    return 0;
}
//注意:使用函数指针数组时需要谨慎操作,避免数组访问越界
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值