zqr

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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;

函数指针调用:

根据之前所说的,函数调用可以通过函数名,函数指针,函数地址调用,实际上只要指明了函数的地址值就可以去调用该类的函数,所以通过指针可以这样调用函数:

(* 指针变量名)(参数) 或者 指针变量名(参数)

posted on 2017-08-21 00:29  zqr  阅读(840)  评论(0)    收藏  举报