共有三个功能:
const double *f1(const double ar[], int n);
const double *f2(const double ar[], int n);
const double *f3(const double ar[], int n);
两个函数指针:
const double *(*p1)(const double *, int) = f1;
auto p2 = f2;
使用指针:
cout << (*p1)(av, 3) << ": " << *(*p1)(av, 3) << endl;
cout << p2(av, 3) << ": " << *p2(av, 3) << endl;
我对指针使用两种类型的工作: (*p1)(av, 3) 和 p2(av, 3) 并且没有给出任何错误。
但是由于某种原因,在使用函数指针数组时它不能这样工作:
const double *(*pa[3])(const double *, int) = { f1, f2, f3 }; //Массив из трех указателей
cout << pa[0](av, 3) << ": " << *pa[0](av, 3) << endl;
cout << (*pa)[0](av, 3) << ": " << *(*pa)[0](av, 3) << endl; //Выдает ошибку. Почему?
这里我也使用了两种形式的指针操作,但是使用数组会产生错误。
第二个类似的例子:
const double * (*(*pd)[3])(const double *, int) = &pa;
const double *pdb = (*pd)[0](av, 3);
const double *pdb = pd[0](av, 3); //Снова выдает ошибку. По идее я использую вторую форму обращения к
//указателя на функцию и все должно работать, но почему-то генерируется ошибка.
所以问题是:为什么在使用指向函数的指针时两种形式的访问指针都有效,但在使用指向函数的指针数组或指向函数指针数组的指针时出现问题?
PS要求:如果可能,请给出与上述示例相关的答案。
提前致谢
在录制中,
(*pa)[0](av, 3)数组被转换为指向第一个元素的指针,解引用这个指针后,得到对函数指针的引用,然后对这个函数指针应用索引运算符,这实际上已经被禁止了。并且有必要首先将索引运算符应用于数组:
(*(pa[0]))(av, 3)。在 c 的情况下,pd您必须首先取消引用指向数组的指针。更好的是,不要用括号和取消引用来欺骗自己并使用
std::invoke写