当前所在位置:珠峰网资料 >> 计算机 >> 软件水平 >> 正文
2015年软件水平考试程序员辅导笔记之浅析函数指针
发布时间:2012/5/21 15:23:52 来源:城市网学院 编辑:ziteng
  函数指针的概念是指向函数的指针变量。 因而“函数指针”自己首先应是指针变量,只不外该指针变量指向函数。在大大都情形下我们使用不到,也忽略了它的存在。函数名现实上也是一种指针,指向函数的进口地址,但它又分歧于通俗的如int*、double*指针,看下面的例子来理解函数指针的概念:
  view plain int function( int x, int y );int main ( void )
  { int (*fun) ( int x, int y );int a = 10, b = 20;function( a, b );fun = function;(*fun)( a, b );……
  }第一行代码首先界说了一个函数function,其输酬报两个整型数,返回也为一个整型数(输入参数和返回值可为其它任何数据类型);后面又界说了一个函数指针fun,与int*或double*界说指针分歧的是,函数指针的界说必需同时指出输入参数,剖明这是一个函数指针,而且*fun也必需用一对括号括起来;并将函数指针赋值为函数function,前提前提是*fun和function的输入参数和返回值必需连结一致,否则无法经由过程编译。可以直接挪用函数function(),也可以直接挪用函数指针,二者是等效的。
  声明函数指针
  回调函数是一个轨范员不能显式挪用的函数;经由过程将回调函数的地址传给挪用者从而实现挪用。要实现回调,必需首先界说函数指针。尽管界说的语法有点不成思议,但如不美观你熟悉函数声明的一般体例,便会发现函数指针的声明与函数声明很是近似。请看下面的例子:
  void f(); // 函数原型
  膳缦沔的语句声了然一个函数,没有输入参数并返回void.那么函数指针的声明体例如下:
  void (*) ();
  函数存放在内存的代码区域内,它们同样有地址,我们若何能获得函数的地址呢?
  如不美观我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的肇端地址。
  界说一个指向函数的指针用如下的形式,以膳缦沔的test()为例:
  int (*fp)(int a); //这里就界说了一个指向函数的指针
  函数指针绝对不能指向分歧类型,或者是带分歧形参的函数,在界说函数指针的时辰我们很轻易犯如下的错误。
  int *fp(int a); //这里是错误的,因为按照连系性和优先级来看就是先和()连系,然后酿成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注重!
  例如函数原型为:
  int fun(int *, int);
  则函数指针可以声明为: int (*pf)(int *, int); [NextPage]   当然从上述例子看不出函数指针的利益,目的主若是想引出函数指针数组的概念。我们从膳缦沔例子可以得知,既然函数名可以经由过程函数指针加以保留,那们也必然能界说一个数组保留若干个函数名,这就是函数指针数组。正确使用函数指针数组的前提前提是,这若干个需要经由过程函数指针数组保留的函数必需有不异的输入、输出值。
  view plain //首先界说256个措置函数(及其实现)。
  int function0( int *, int );……
  int function255( int *, int );
  //其次界说函数指针数组,并给数组赋值。
  void (*fun[256])( int *, int );
  fun[0] = function0;……
  fun[255] = function255;
  如不美观赋了分歧的值给函数指针,那么挪用者将挪用分歧地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。
  下面我们来看一个具体的例子:
  view plain int test(int a)
  { return a;}
  int main(void)
  { int (*fp)(int a);fp = test; //将函数test的地址赋给函数指针fp cout《fp(5)《“|”《(*fp)(10)《endl; //输出fp(5),这是尺度c++的写法,(*fp)(10)这是兼容c说话的尺度写法,两种赞成,但注重区分,避免写的轨范发生移植性问题!
  return 0;} typedef界说可以简化函数指针的界说,在界说一个的时辰感受不出来,但界说多了就知道便利了,膳缦沔的代码改写成如下的形式:
  view plain int test(int a)
  { return a;}
  int main(void)
  { typedef int (*fp)(int a); //注重,这里不是生命函数指针,而是界说一个函数指针的类型,这个类型是自己界说的,类型名为fp fp fpi; //这里操作自己界说的类型名fp界说了一个fpi的函数指针!
  fpi = test;cout《fpi(5)《“|”《(*fpi)(10)《endl; //输出fp(5),这是尺度c++的写法,(*fp)(10)这是兼容c说话的尺度写法,两种赞成,但注重区分,避免写的轨范发生移植性问题!
  return 0;}
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved