拥有功能指针类型是什么意思

What does it mean to have a function pointer type?

本文关键字:是什么 意思 类型 指针 功能 拥有      更新时间:2023-10-16

我有一个课堂分配:

编写一个函数的声明,该函数采用两个int参数并返回一个int,并声明一个元素具有此函数指针类型的向量。

由于功能和向量都是int这是否正确的?我仍然对指针感到模糊。这就是我所拥有的:

#include <iostream>
#include <vector>
using std::cin; using std::cout; using std::endl; using std::vector;
// This is my function that take two ints and returns and int
int AddFunc ( int a, int b) { int addResult; addResult = a + b; return (addResult);}
int main()
{
    vector <int> v1; // Declare a vector whose elements have this functions pointer types
    int add1, add2, add3 = 0;
        cout << "Enter two numbers to be added with my AddFunc function: ";
        cin >> add1 >> add2;
        add3 = AddFunc (add1, add2);
        cout << "The numbers added equal: " << add3 << endl;
        v1.push_back(add3);
        cout << "The first element in the vector v1 is: " << v1 [0] << endl;
    return 0;
}

功能指针类型为 int (*)(int, int)。您想要这个:

typedef int (*fptr)(int, int);
std::vector<fptr> v;

示例:

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
v.push_back(&add);
v.push_back(&mul);

然后类似的东西:

for (f : v) { std::cout << "f(5, 7) = " << f(5, 7) << std::endl; }

在C 中,您有能力定义功能指针,例如:

int (*pfunc) (int, int);

这是一个变量,只要它具有指定的签名,就可以分配函数的地址,例如:

pfunc = AddFunc; // Assign the adress of a function
pfunc(1,2) // Now call the function through the pointer

现在,请注意pfunc是可变名称,其"官方"类型为int (*) (int,int)自然,这一切都会变得非常混乱,所以您可能想打字:

typedef int (*AdderFunc)(int, int);
AdderFunc pfunc = AddFunc;
pfunc(1,2);

作业需要一个功能指针向量。如果您不习惯它们,功能指针很难阅读。这是您可以用来编写功能指针类型的方法。

首先,编写函数的参数列表。AddFunc()进行了两个int参数,因此起初您有:

(int, int)

要成为功能指针,您可以将其前缀为(*)

(*)(int, int)

最后,您将整个内容的返回类型与函数的返回类型相结合。在这种情况下,int

int (*)(int, int)

您可以将其用作向量的类型:

std::vector<int (*)(int, int)> v;

这将起作用。但是,通常更清楚地为功能指针定义自己的类型(使用typedef)。起初,这样做似乎很棘手,但这很容易。您已经使用上述方法写下了类型。唯一缺少的是给它一个名字。您可以通过在(*)中的*之后编写名称来做到这一点。例如(*func_ptr),所以您有:

int (*func_ptr)(int, int)

,这就是typedef的全部所需:

typedef int (*func_ptr)(int, int);

现在,每当您需要该特定功能指针类型时,而不是:

int (*)(int, int)

您可以写:

func_ptr

而是。因此,您的向量声明变为:

std::vector<func_ptr> v;

就向量而言,func_ptr是一种指针类型。

函数指针与"常规"指针不同,因为它们将其调用它们指向的功能。您实际上并没有取消功能指针。相反,您在其上使用()操作员。这样做调用他们指向的功能。

分配给功能指针意味着将其分配给函数的地址。例如,如果您具有func_ptr类型的变量(上面您的typedef ED):

func_ptr AddFunc_p;

您可以将其分配给AddFunc()的地址:

AddFunc_p = AddFunc;

请注意AddFunc中缺少的括号。您只能编写函数的名称,因为您不想实际调用该功能,而是想要其地址,以便您可以将其分配给AddFunc_p。现在,您可以通过以下方式通过AddFunc_p调用AddFunc()

AddFunc_p(some_int, another_int);

您现在应该能够扣除如何将功能指针放入向量中以及如何在其元素上应用()操作员。这将有助于牢记矢量仅包含类型func_ptr的元素。