C++函数指针

通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*p_fun)替换函数名。这样p_fun就是这类函数的指针。

使用函数指针调用函数时,p_fun和(*p_fun)等价。

运算符[]的优先级高于*,*p_fun[3]表明p_fun是一个包含三个指针的数组。

自动类型推断auto,只能用于单值初始化,不能用于初始化列表。但声明一个数组之后,使用auto,发现是同一个地址,且没有数组长度!!不能用于auto v1=v2[size]。

——7.10 函数指针《C++PrimerPlus》

#include <iostream>

int tadd(int, int);
int tsub(int, int);
int tmul(int, int);

void t_p_fun(int, int, int (*)(int, int));

int main(int, char **)
{
    using namespace std;
    int a = 8, b = 2;
    cout << "-------------------函数调用------------------------" << endl;
    cout << "tadd(a,b):     \t" << tadd(a, b) << endl;
    cout << "tsub(a,b):     \t" << tsub(a, b) << endl;
    cout << "tmul(a,b):     \t" << tmul(a, b) << endl;

    cout << "-----------------函数指针调用-----------------------" << endl;
    int (*p_add)(int, int) = tadd;
    cout << "p_add(a, b):   \t" << p_add(a, b) << endl
         << "(*p_add)(a, b):\t" << (*p_add)(a, b) << endl;

    cout << "-----------------函数指针传递-----------------------" << endl;
    t_p_fun(a, b, p_add);
    cout << "-----------------函数指针数组-----------------------" << endl;
    int (*p_fun_arr[3])(int, int) = {tadd, tsub, tmul};
    t_p_fun(a, b, p_fun_arr[0]);
    cout << "-----------------auto自动推断----------------------" << endl;
    auto pp_fun_arr = &p_fun_arr;
    cout<< "指针数组指针\t" << (*pp_fun_arr)[0](a,b) << endl;;

    cout << "-------------------范围循环------------------------" << endl;
    int i = 0;
    for (auto p_fun : p_fun_arr)
    {
        t_p_fun(a, b, p_fun);
        t_p_fun(a, b, (*pp_fun_arr)[i++]);
    }

    cout << "-----------------typedef简化----------------------" << endl;
    typedef int (*p_func)(int, int);
    p_func p1 = tadd;
    t_p_fun(a, b, p1);

    return 0;
}

void t_p_fun(int a, int b, int (*p_fun)(int, int))
{
    using namespace std;
    cout << "p_fun(a, b):   \t" << p_fun(a, b) << endl;
    //  << "(*p_fun)(a, b):\t" << (*p_fun)(a, b) << endl;
}

int tadd(int a, int b)
{
    return a + b;
}
int tsub(int a, int b)
{
    return a - b;
}
int tmul(int a, int b)
{
    return a * b;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值