有一个函数指针类型是什么意思?

时间:2012-10-21 21:37:43

标签: c++ function-pointers

我有一个课程作业说:

  

为一个函数编写一个声明,该函数接受两个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;
}

3 个答案:

答案 0 :(得分:4)

函数指针类型为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; }

答案 1 :(得分:2)

在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);

答案 2 :(得分:1)

赋值需要一个函数指针向量。如果您不习惯它们,函数指针有点难以阅读。这是一个可以用来编写函数指针类型的方法。

首先,编写函数的参数列表。 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编辑过):

func_ptr AddFunc_p;

您可以为其指定AddFunc()的地址:

AddFunc_p = AddFunc;

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

AddFunc_p(some_int, another_int);

您现在应该能够推断出如何将函数指针放在向量中以及如何在其元素上应用()运算符。这将有助于记住,向量只包含func_ptr类型的元素。