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;
}