C++中函数指针有什么用

这篇文章主要为大家展示了“C++中函数指针有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中函数指针有什么用”这篇文章吧。

1、函数指针

函数指针顾名思义,就是指向函数的指针。

和数据类似,C++当中函数也有地址,函数的地址是存储函数机器语言代码的内存地址。我们可以将另外一个函数的地址作为参数传入函数,从而实现函数的灵活调用。

1.1 获取函数地址

think

如果我们想要将think函数当做参数传入另外一个函数,我们可以这么写:

func(think);

1.2 声明函数指针

声明函数指针和声明函数类似,我们声明一个函数可以这么写:

double process(int);

而我们声明函数指针则可以写成这样:

double (*pt)(int);
(*pt)(*pt)

1.3 函数指针传参

如果我们要实现一个函数,它的一个参数是一个函数指针,它的写法和刚才一样:

double func(double x, double (*pt)(int));
double

1.4 调用函数

最后, 我们来看下通过指针调用函数的部分。

(*pt)(*pt)

如:

double process(int);
double (*pt)(int);

pt = process;
cout << (*pt)(5) << endl;

2、函数指针进阶

C++ primer
const double* f1(const double ar[], int n);
const double* f2(const double [], int);
const double* f3(const double *, int);
const double ar[]const double [] const double *。

有了这三个函数之后,假设我们要声明一个指针,指向这三个函数。根据我们前文当中说过的,可以将函数名替换成(*pt)来实现:

const double* (*pt)(const double *, int) = f1;
const double *(*pt)
auto
auto p2 = f2;
(*p2)

也可以直接使用名称调用:

const double* x = p2(ar, 3);
const double* y = (*p2)(ar, 3);
auto p2 = &f2 C++

问题还没有结束,假如我们要定义一个指向函数的指针数组呢?这应该怎么声明?

const double* (*pt)(const double *, int)

正确答案是放在括号里:

const double* (*pt[3])(const double *, int);
*pt[3]
auto

到这里还没结束,还有更恐怖的,如果我们想要定义一个指向这个数组的指针,应该怎么办呢?如果使用auto可以写成:

auto ptr = &pt;

如果不使用auto呢?首先我们可以想到,这个声明是基于pt的,我们需要在pt的声明上加上一个*,但问题是加在哪里呢?

进一步分析,会发现我们需要指出这是一个指针,而不是数组。意味着核心的部分应该写成(*ptr)[3],表示这是一个指向长度为3的数组的指针。因为[]的优先级更高,所以需要使用括号。如果写成*ptr[3]表示这是长度为3的指针数组。

我们进一步倒推,(*ptr)[3]这个数组当中的元素是什么类型呢?是指向函数的指针,所以写出来结果是这样:

const double *(*(*ptr)[3])(const double*, int) = &pt;

很明显,这样的定义非常非常的难以理解。而且这还不是最复杂的情况,比如函数的返回类型又是一个指向一个函数的指针……明摆着告诉我们含义我们仍然要推敲一会,如果在一段不明的代码当中遇到,可能会直接抓狂吧……

auto
golang

如果是golang来定义同样的内容,会是这样的:

func f2(arr []float64, n int) *float64 {
    // todo
}

// 函数指针
var p1 func([]float64, int) *float64 = f2;
// 函数指针数组
var pt [3]func([]float64, int) *float64;
// 函数指针数组的指针
var ptr *[3]func([]float64, int) *float64 = &pt;

很明显,虽然变量类型写在变量后面刚开始会不太习惯,但是很明显这样要清晰很多。

以上是“C++中函数指针有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!