函数指针初步了解

C++版的函数指针的定义、初始化以及调用的一个具体例子

#include <iostream>

const double * f1(const double ar[], int n);
const double * f2(const double [], int n);
const double * f3(const double *, int n);

int main(void)
{
    using namespace std;

    double av[3] = { 1231.3, 2236.4, 3456.9 };

    const double * (*p1)(const double *, int) = f1;//声明目标函数原型并初始化
    //使用自动推断功能,等价于const double * (*p2)(const double *, int) = f2
    auto p2 = f2;   

    cout << "Using Pointer To Fountion:\n";
    cout << "Address   value\n";
    //(*p1)(av, 3)和 p2(av, 3)都调用指向的函数(这里为f1()和f2()),并将av和3作为参数
    //显示的是这两个函数的返回值,返回值的类型是const double *(即double值得地址)
    //为了显示存储在这两个地址中的实际值,对地址运用运算符*(*(*p1)(av, 3),*p2(av, 3))
    cout << (*p1)(av, 3) << ";" << *(*p1)(av, 3) << endl;
    cout << p2(av, 3) << ";" << *p2(av, 3) << endl;



    //声明指向三个函数的指针,形成一个函数指针数组,使函数调用更方便
    //因为运算符[]的优先级高于*,所以*pa[3]表明pa是一个包含三个指针的数组
    const double * (*pa[3])(const double *, int) = { f1, f2, f3 };
    auto pb = pa;

    cout << "\nUsing a array to pointers to fountion\n";
    cout << "Address" <<   "Value\n";
    //pa,pb表示指向函数指针的指针,pa[i],pb[i]表示数组中的指针,因此可以将任一种函数调用表示法用于它们
    //const double * px = pa[0](av,3)/const double * py = (*pb[1])(av,3)
    //double px = *pa[0](av,3)/double py = *(*pb[1])(av,3)
    for (int i = 0; i < 3; i++)
    {
        cout << pa[i](av, 3) << ";" << *pa[i](av, 3) << endl;

    }




    //创建指向整个数组的指针,假设指针名为pd,因为pd是一个指针,不是数组,所以核心部分应该是(*pd)[3]
    //即运算符*先与pd 结合
    auto pd = &pa;//相当于const double *(*(*pd)[3])(const double *, int) = &pa;

    cout << "\nusing pointers to an array of pointer\n";
    cout << "Address " << " Value\n";
    //pd为指向数组的指针,则*pd为数组,(*pd)[i]是数组中的元素,即函数指针
    //所以函数调用方式为(*pd)[i](av,3)或者(*(*pd)[i])(av,3)
    //返回指针指向的值为*(*pd)[i](av,3)或者*(*(*pd)[i])(av,3)
    cout << (*pd)[0](av, 3) << ";" << *(*pd)[0](av, 3) << endl;
    cout << (*(*pd)[1])(av, 3) << ";" << *(*(*pd)[1])(av, 3) << endl;




    return 0;
}

const double * f1(const double ar[], int n)
{
    return ar;
}
const double * f2(const double ar[], int n)
{
    return ar + 1;
}
const double * f3(const double *ar, int n)
{
    return ar + 2;
}

猜你喜欢

转载自blog.csdn.net/vonvingon/article/details/71158623