语法

返回值 (*指针名) (参数列表)

例:


int add(int x, int y)
{
return x + y;
}
int main()
{
int (*func)(int a, int b);
func = add;
cout<< add(1, 2) << endl;
}

输出: 3

这里将add的函数首地址传给了这个函数指针,现在这个指针就指代这个函数,传入参数就可以使这个函数执行。

注意:int(*)(int a, int b)是一个函数指针类型,和int,double类似。而func相当与int a的a。

根据上面这一条,我们可以用typedef测试一下

typedef int(*Func)(int a, int b);
int main()
{
Func fn = add;
add(1, 2);
return 0;
}
可以运行

我们也可以直接赋值并运行:(void(*)(void))eip()。这条语句前面是一个void(*)(void)的函数指针,它的值是eip.后面的括号表示运行它

函数指针在类中的使用

我们是不可以直接用函数指针指向类中的函数的,因为成员函数在创建时会隐式添加一个this参数。

typedef int(Adder::* Fm)(int a, int b);
Adder adder(1);
Fm f = &Adder::Add;
std::cout << (adder.*f)(1, 2) << std::endl;
这样可以运行
它的签名实际上是int(*)(Adder *const this, int a, int b)

但是这样的话这个指针就只可以指向这一个类中的函数了,也就失去了函数指针的优势。

我们可以通过重载()运算符实现多个函数之间使用。

class Adder {
public:
Adder(int c) {
this->c = c;
}
int operator()(int a, int b) {
return a + b + c;
}
private:
int c;
};

class Multiplier {
public:
Multiplier(int c) {
this->c = c;
}

int operator()(int a, int b) {
return a * b * c;
}
private:
int c;
};



template<typename T>
void Do(T& f, int a, int b) {

int r = f(a, b);
std::cout << r << std::endl;
};

int _tmain(int argc, _TCHAR* argv[]) {
Adder adder(1);
Do(adder, 1, 2); //输出4

Multiplier multiplier(10);
Do(multiplier, 2, 3); //输出60

return 0;
}