1.函数的入口地址
函数名,函数地址,函数指针,也就是说可以将函数地址看成跟变量类似的形式,通过地址来进行间接调用
例如:
1 void test(); 2 3 int main(){ 4 test();//通过函数名来调用 5 (&test)();//通过函数地址调用 6 (* &test)();//通过函数地址间接调用 7 8 cout<<test<<endl; 9 cout<<&test<<endl; 10 cout<<*&test<<endl;//以上三个式子都是显示函数地址 11 }
2.函数指针
顾名思义即指向函数的指针变量就是函数指针
相关概念:
函数类型:同数据类型类似,将相同结构的函数抽象成一类,便于组织和调用,同时是函数的接口,包括函数的参数类型,顺序,数量和返回类型
例如:
1 double max(double x,double y); 2 double min(double x,double y);
以上两个函数是相同类型,因为他们的参数类型(double),顺序(double,double),数量(2)和返回类型(double)均相同。
同时,上面的函数类型可以表示为:
double (double,double)
也就是:类型 (参数定义)
一般利用typedef关键字来为函数类型起另一个便于表示的别名,其表示方式为:typedef 类型 函数类型名 (函数定义);
例如:
1 typedef double function (double,double);
同上面的函数类型定义是一样的。
如果定义了函数类型名,之后可以直接通过函数类型名去声明函数指针:
function* max,min;// 函数指针声明 function max,min;//函数类型声明
函数指针:指向某一类函数的指针变量,其表示方式为:
类型 (* 指针变量名) (函数参数定义) 或者 函数类型名 * 指针变量名
注意:在第一种声明格式中,由于*的优先级比较高,如果没有加上括号的话,这里会编程一个返回指针值的函数原型
例如:
1 double (* fp)(double,double); 2 function* fp;
以上两种声明格式都声明了一个fp的函数指针,指向function函数类型
或者利用更进一步,直接可以使用typedef定义函数指针,方便后面编程的使用:
typedef 类型 (* 指针类型名) (参数定义) 或者 typedef 函数类型 * 指针类型名
例如:
1 typedef double (* pType) (double,double); 2 typedef function * pType;
上面两种方式同定义了一个pType类型,该类型为函数指针类型,可以直接使用该类型去定义一个函数指针:
pType pf1;
函数指针调用:
根据之前所说的,函数调用可以通过函数名,函数指针,函数地址调用,实际上只要指明了函数的地址值就可以去调用该类的函数,所以通过指针可以这样调用函数:
(* 指针变量名)(参数) 或者 指针变量名(参数)
浙公网安备 33010602011771号