2010-04-06 75 views
19

我想请教一下指针在C++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

相信第二呼叫自动解析为在编译器中第一呼叫...

+0

所以你的意思是,第二个电话是正确的? – BobAlmond 2010-04-06 17:20:45

+1

不,我的意思是说,编译器解析了对函数指针的调用,这实际上是一个语法偏好问题。 – 2010-04-06 17:22:44

10

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

3

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

这与数组变量名称非常类似,它充当数组第一个元素的地址。

0

这是因为不存在这样的对象(在表达式换算)为功能,只有函数指针。当你想通过函数到你的功能你其实可以通过的仅仅是指针,所以编译器这个塑像为您

+0

有些对象叫做函数(用表达式来说):'add'就是这样一个对象,它的类型是'int(int,int)'。尽管如此,它们在很多情况下都暗指衰败。 – avakar 2010-04-06 18:50:13

+0

请举例说明函数和作为表达式的指针真的不同 – Andrey 2010-04-06 19:20:49

+0

是的,函数不是对象,但它们是函数(惊喜xD)。例如'void f(){} void(&fr)()= f;'因为f是函数类型的表达式,并且你将引用绑定到它,而void(&fr)()=&f;'不因为'&f'是指针类型的表达式。另一个例子 - 尝试'sizeof(f)'并注意它失败,因为函数没有大小。像@avakar所说的,这里的f类型是'void()',add的类型是'int(int,int)' – 2010-04-06 21:18:48

3

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

但是请注意,在C++中,获得一个指向成员功能需要您使用“&”操作。

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是试图推导出这两个函数指针和函数型(无腐烂的指针传递给一个参考时所做的彪炳参数!)。