我想问一下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);
有什么区别吗?因为当我尝试时,结果是相同的,没有错误。
非常感谢
答案 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)
因为函数没有这样的对象(就表达式而言),只有指向函数的指针。当你想将函数传递给你的函数时,你唯一可以传递的就是指针,所以编译器会为你做这个演员