函数指针
1. 定义
每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。
注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址
2. 语法
指向函数的指针变量的一般定义形式为:
数据类型 (*指针变量名) (参数表);
3. 说明
- 函数指针定义形式中的数据类型是指函数的返回值的类型。
- 区分下面两个语句:
int (*p)(int a, int b); //p是一个指向函数的指针变量,函数返回类型为整型
int *p(int a, int b); //p是函数名,函数返回类型为整型指针
- 函数指针指向的变量不是固定的某一个函数的,只是定义了一个变量专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。
- 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。
int max(int x, int y) { return x+y; }
void main()
{
//定义一个函数指针
int (*p)(int a, int b);
p = max; //正确
p = &max; //正确
//通过函数指针定义变量
p(1,2); //正确
(*p)(1,2); //同样正确
}
- 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。
int fn1(int x, int y);
int fn2(int x);
//定义如下的函数指针:
int (*p1)(int a, int b); int (*p2)(int a);
p1 = fn1; //正确
p2 = fn2; //正确
p1 = fn2; //产生编译错误
- 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。
- 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。
4. 举例
源代码:
#include <iostream>
using namespace std;
int max(int x, int y); //求最大数
int min(int x, int y); //求最小数
int add(int x, int y); //求和
void process(int i, int j, int (*p)(int a, int b)); //应用函数指针
int main()
{
int x, y;
cin>>x>>y;
cout<<"Max is: ";
process(x, y, max);
cout<<"Min is: ";
process(x, y, min);
cout<<"Add is: ";
process(x, y, add);
getch();
return 0;
}
int max(int x, int y)
{
return x > y ? x : y;
}
int min(int x, int y)
{
return x > y ? y : x;
}
int add(int x, int y)
{
return x + y;
}
void process(int i, int j, int (*p)(int a, int b))
{
cout<<p(i, j)<<endl;
}
函数指针类型
通过typedef定义函数指针类型
int max(int x, int y)
{
return x > y ? x : y;
}
//定义函数指针类型
typedef int(*pFun)(int, int)
int main()
{
//通过函数指针类型定义函数指针
pFun fun = &max;
fun(1,2);
return 0;
}