函数指针
每一个函数在编译时,系统会分配给该函数一个入口地址,函数名表示这个入口地址,函数名是函数指针常量。指向函数的指针变量称之函数指针变量。
函数指针变量的定义
返回值类型 (*函数指针变量名)(参数类型列表);
例如:
如果定义了一个函数,其函数原型为“int fun(int,int,int);”
int(*funP)(int,int,int);
funP=fun;
函数指针变量的引用
返回值类型 (*&引用名)(形参表)=匹配的函数指针变量名;
例如:
int(*funP)(int,int,int)=nullptr;
int(*&rfunP)(int,int,int)=funP;
rfunP与funP是同一对象。
函数名的引用
函数名是函数指针常量,函数名的引用就是函数指针常量的引用。
返回值类型 (*const&引用名)(形参表)=匹配的函数名;
例如:
如果定义了一个函数,其函数原型为“int fun(int,int,int);”
int(*const&rfun)(int,int,int)=fun;
函数指针数组的定义
返回值类型 (*函数指针变量名[长度])(形参表);
例一:定义函数指针数组
int(*pfuns[4])(int,int,int);
pfuns数组中的每个元素只能指向其函数原型为“int 函数名(int,int,int);”的函数。
例二:定义函数指针数组并初始化
double a1(double,double);
double a2(double,double);
double a3(double,double);
double (*pfun[3])(double,double)={a1,a2,a3};
函数指针数组的引用
返回值类型 (*(&引用名)[长度])(形参表)=匹配的函数指针数组名;
例如:
int(*pfuns[4])(int,int,int)={nullptr};
int(*(&rfuns)[4])(int,int,int)=pfuns;//函数指针数组的引用
rfuns与pfuns是同一对象,都是数组。
例子:演示函数指针变量、函数指针变量的引用、函数指针数组和函数指针数组的引用的使用。
#include <iostream>
using namespace std;
int add(int a,int b){return a+b;}
int sub(int a,int b){return a-b;}
int mul(int a,int b){return a*b;}
int divi(int a,int b){if(b)return a/b;else cout<<"出错";}
int main()
{
int a=100,b=10;
int(*pfun)(int,int);//函数指针变量
pfun = add,cout << pfun(a, b) << ends,
pfun = sub,cout << pfun(a, b) << ends,
pfun = mul,cout << pfun(a, b) << ends,
pfun = divi,cout<< pfun(a, b) << endl;
int(*pfuns[])(int, int)={add, sub, mul, divi}; //函数指针数组
cout << pfuns[0](a, b) << ends << pfuns[1](a, b) << ends << pfuns[2](a, b) << ends << pfuns[3](a, b) << endl;
int(*(&rfun0))(int, int)(pfuns[0]);//函数指针的引用
int(*(&rfun1))(int, int)(pfuns[1]);
int(*(&rfun2))(int, int)(pfuns[2]);
int(*&rfun3)(int, int)=pfuns[3];
cout<<rfun0(a, b)<<ends<<rfun1(a, b)<<ends<<rfun2(a, b)<<ends<<rfun3(a, b)<<endl;
int(*(&rfuns)[4])(int,int)=pfuns;//函数指针数组的引用
cout<<rfuns[0](a,b)<<ends<<rfuns[1](a,b)<<ends<<rfuns[2](a,b)<<ends<<rfuns[3](a,b)<< endl;
return 0;
}
例子:存在的现象
#include <iostream>
using namespace std;
int fun(int x,int y,int z)
{
return (x+y+z);
}
int main()
{
int a=1,b=2,c=3;
cout<<fun(a,b,c)<<endl;
cout<<(&fun)(a,b,c)<<endl;
cout<<(********fun)(a,b,c)<<endl;
int(*funP)(int,int,int);
funP=fun;
cout<<funP(a,b,c)<<endl;
cout<<(********funP)(a,b,c)<<endl;
funP=&fun;
cout<<funP(a,b,c)<<endl;
cout<<(***********funP)(a,b,c)<<endl;
funP=********fun;
cout<<funP(a,b,c)<<endl;
cout<<(***********funP)(a,b,c)<<endl;
return 0;
}
函数指针型的自定义
typedef类型说明符(*用户类型名)(特定形参表);
typedef void (*FunType)(int ); //定义一个函数指针类型
FunType FunP1,FunP2,FunP3;//等价于void (*FunP1)(int ), (*FunP2)(int ) , (*FunP3)(int );
例:
#include <iostream>
using namespace std;
void MyFun(int x)
{
printf("%d\n",x);
}
typedef void (*FunType)(int ); //定义一个函数指针类型
int main(int argc, char* argv[])
{
FunType FunP; //定义一个函数指针变量
MyFun(10);
FunP=MyFun;
FunP(20);
return 0;
}
函数指针作为函数的参数
#include <iostream>
using namespace std;
void MyFun1(int x)
{
printf("函数MyFun1中输出:%d\n",x);
}
void MyFun2(int x)
{
printf("函数MyFun2中输出:%d\n",x);
}
void MyFun3(int x)
{
printf("函数MyFun3中输出:%d\n",x);
}
typedef void (*FunType)(int );
void CallMyFun(FunType fp,int x) //此函数头也可写成void CallMyFun(void(*fp)(int),int x)
{
fp(x);
}
int main()
{
CallMyFun(MyFun1,10);
CallMyFun(MyFun2,20);
CallMyFun(MyFun3,30);
}