C ++指向函数的指针,初学者问题

时间:2010-04-06 17:17:00

标签: c++ function pointers

我想问一下C ++中的指针

我有一些简单的代码:

int add(int a, int b){
 return a+b;
}

int runner(int x,int y, int (*functocall)(int, int)){
 return (*functocall)(x,y);
}

现在,假设我使用这种方式调用这些函数:

cout<<runner(2,5,&add);

或者

cout<<runner(2,5,add);

有什么区别吗?因为当我尝试时,结果是相同的,没有错误。

非常感谢

6 个答案:

答案 0 :(得分:10)

根据C ++标准(4.3 / 1),函数将隐式转换为指针。没有区别。但是,此转换从不适用于非静态成员函数。对于他们,你应该明确地写&

答案 1 :(得分:3)

没有区别。为了与获取指针的其他方式保持一致,您可以使用&,但名称本身没有其他含义,因此假设它意味着“获取地址”。

它与作为数组第一个元素地址的数组变量名非常相似。

答案 2 :(得分:3)

不,在这种特殊情况下没有区别。任何一个都会给你函数的地址。

但请注意,在C ++中,获取指向成员函数的指针需要使用'&amp;'操作

答案 3 :(得分:1)

请注意,您可以引用函数

int runner(int x,int y, int (&functocall)(int, int)){
 return functocall(x,y);
}

现在用&add调用它将不再起作用,因为您尝试将函数引用绑定到指针而不是函数。有时这会在使用模板时闪耀光芒

template<typename T>
int runner(int x,int y, T &functocall, T otherfunc){
 return functocall(x,y) + otherfunc(y, x);
}

现在用runner(10, 20, add, add)调用它会失败,因为T被试图推导到函数指针和函数类型(传递给引用参数时没有衰减到指针!)

答案 4 :(得分:0)

我相信第二个调用会自动解析为编译器中的第一个调用...

答案 5 :(得分:0)

因为函数没有这样的对象(就表达式而言),只有指向函数的指针。当你想将函数传递给你的函数时,你唯一可以传递的就是指针,所以编译器会为你做这个演员