函数指针

看到这里,觉得有必要写一下,虽然复杂一点的函数,数组指针看起来有点麻烦,不过细心下来,也不是那么难,比如

double(*p)(double a, double b);
    p = max;//函数名就是函数地址
    double a = p(4, 5);//函数名是函数地址,指针p指向函数的地址,所以p应该和max有相同的
    double b = (*p)(4, 5);//p是函数指针,*p就是函数
    cout << "a=" << a << endl << "b=" << b << endl;
    //结果a和b一样,这两种用法都可以
    //如果声明了一个函数,又定义一个指向该函数的指针,可以使用c++11
     //的自动类型推断功能,这样就方便得多,上面的就可以写成
     auto p=max;//而不用写成
        //double(*p)(double a, double b);
         //p = max;
       //了,但是quto只能用于单值初始化,而不能初始化列表
         // 还可以用typedef简化
     typedef  double(*type)(double a, double b);
      type p;     

下面这段代码是书上抄的,很有意思,不过书上有一个小错误

# include<iostream>
const double *f1(const double ar[],int n);
const double *f2(const double[], int);
const double *f3(const double*,int);
using namespace std;
int main()
{
    double av[3] = { 1112.3, 1542.6, 2227.9 };
    const double *(*p1)(const double *, int) = f1;
    typedef const double *(*type)(const double *, int);
    type p3 = f1;
    //指向函数(f1)的指针,首先,p1是个指针,所以(*p1),其实只要用(*p1)代替f1即可
    auto p2 = f2;//c++11可以直接用auto自动类型判断,但只能是单值初始化,不能初始化列表
    cout << "Using pointers to functions:\n";
    cout << "Address  Value\n";
    cout << (*p1)(av, 3) << ":" << *(*p1)(av,3)<< endl;
    cout << p2(av, 3) << ":" << *p2(av, 3) << endl;

    cout << (*p3)(av, 3) << ":" << *(*p1)(av, 3) <<"用typedef完全可以"<< endl;
    //===============
    const double *(*pa[3])(const double *, int) = {f1,f2,f3};
    //这里不能用auto了,
    auto pb = pa;
    cout << "\nUsing an array of pointers to functions:\n";
    cout << "Address  Value\n";
    for (int i = 0; i < 3; i++)
        cout << pa[i](av, 3) << ":" << *pa[i](av, 3) << endl;
    cout << "\nUsing a pointer to a pointer to a function:\n";
    cout << "Address  Value\n";
    for (int i = 0; i < 3;i++)
        cout << pb[i](av, 3) << ":" << *pb[i](av, 3) << endl;
    cout << "\nUsing pointers to an array of function pointers:\n";
    cout << "Address  Value\n";
    auto pc = &pa;
    cout << (*pc)[0](av, 3) << ":" << *(*pc)[0](av, 3) << endl;
    const double *(*(*pd)[3])(const double *, int) = &pa;//指向整个数组pa的指针
    const double *pdb = (*pd)[1](av, 3);//pdb是指向数组pa第二个元素的指针
    cout << pdb << ":" << *pdb << endl;
    cout << (*(*pd)[2])(av, 3) << ":" << *(*(*pd)[2])(av, 3) << endl;
    system("pause");
    return 0;
}
const double *f1(const double ar[], int n)
{
    return ar;
}
const double *f2(const double ar[], int)
{
    return ar + 1;
}
const double *f3(const double* ar, int)
{
    return ar + 2;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值