函数指针
1)概念
函数指针是指向函数的指针变量。因此"函数指针"本身首先应是指针变量,只不过该指针变量指向函数。
2)函数指针和指针函数的区别
名称 | 函数指针 | 指针函数 |
---|
本质 | 指针 | 函数 |
区别 | 指向函数的指针变量 | 返回值为指针的一个函数 |
用法 | 返回值 (*p)(参数列表),p就是函数指针 | 返回值* Function(参数列表),Fuction就是指针函数 |
3)普通函数的函数指针使用
#include <stdio.h>
int (*p)(int); // 方法1 要和函数的返回值,参数列表一致才能使用
typedef int (*MyFunction)(int); //方法2 (用typedef给函数指针重新命名)
int Print(int n)
{
printf("Function Pointer\r\n");
return 0;
}
int main()
{
//方法1的实现
p = &Print; //p指向了Print(int)
p(5); //调用Print(int)
//方法2的实现
MyFunction q = &Print; //将函数指针命名为q
q(4);
return 0;
}
4) 成员函数的函数指针使用
#include <stdio.h>
class Object
{
public:
int Print(int n)
{
printf("Function Pointer\r\n");
return 0;
}
};
int (Object::* p)(int); //方法1
typedef int (Object::*MyFunction)(int); //方法2(用typedef给函数指针重新命名)
int main()
{
p = &Object::Print;
Object obj;
(obj.*p)(5); //方法1的实现 p表示函数地址,*p表示函数
MyFunction q = &Object::Print; //将函数指针命名为q
(obj.*q)(4); //方法2的实现
return 0;
}
5)C++11以后可以using代替,更加简便:using 新名称=返回类型(*)(参数类型);
#include <iostream>
int Product(int a,int b)
{
return a * b;
}
void Print()
{
std::cout << "Print" << std::endl;
}
using FuctionProduct =int(*)(int, int); //比typedef可读性更高
using FuctionPrint = void(*)(void); //using 新名称=返回类型(*)(参数类型);
int main()
{
FuctionProduct fuc1 = Product;
FuctionPrint fuc2 = Print;
int n=fuc1(2, 3);
fuc2();
return 0;
}