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

C++ C++;指向函数的指针,初学者问题,c++,function,pointers,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); CUT> P>我相信第二个调用自动解析到编译器中的第一个调用……< /P> < P>函数将

我想问一下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);

<代码> CUT> P>我相信第二个调用自动解析到编译器中的第一个调用……< /P> < P>函数将根据C++标准隐式地转换为指针(4.3/1)。没有区别。但是,这种转换从不适用于非静态成员函数。对于它们,您应该明确地编写
&

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


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

这是因为没有像函数这样的对象(就表达式而言),只有指向函数的指针。当你想把函数传递给你的函数时,你唯一能传递的就是指针,所以编译器会为你做这个转换。不,在这种特殊情况下没有区别。任何一个都可以提供函数的地址


注意,在C++中,得到指向成员函数的指针需要使用'&’运算符.< /p> 注意,您可以对函数< /p>进行引用。

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);
}
模板
int runner(int x,int y,T&functocall,T otherfunc){
返回函数调用(x,y)+其他函数调用(y,x);
}

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

否,我的意思是编译器解析对函数指针的调用,这实际上是一个语法偏好的问题。有一些被称为函数的对象(就表达式而言):
add
就是这样一个对象,它的类型是
int(int,int)
。但在许多上下文中,它们会隐式衰减为指向自身的指针。请举例说明函数和指向函数的指针作为表达式项的区别,函数不是对象,而是函数(令人惊讶的xD)。例如
void f(){}void(&fr)(=f
之所以有效,是因为f是函数类型的表达式,您将引用绑定到它,而
void(&fr)(=&f不起作用,因为
&f
是指针类型的表达式。另一个例子-尝试执行
sizeof(f)
,注意它失败了,因为函数没有大小。正如@avakar所说,这里f的类型是
void()
,add的类型是
int(int,int)
template<typename T>
int runner(int x,int y, T &functocall, T otherfunc){
 return functocall(x,y) + otherfunc(y, x);
}