C/C++中函数指针的含义

2016-02-19 20:00 7 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享C/C++中函数指针的含义吧。

【 tulaoshi.com - 编程语言 】

函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢?
  
  假如我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。 !-- frame contents -- !-- /frame contents --   定义一个指向函数的指针用如下的形式,以上面的test()为例: int (*fp)(int a);//这里就定义了一个指向函数的指针   函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很轻易犯如下的错误。int *fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注重!   下面我们来看一个具体的例子:#include iostream 
  #include string 
  using namespace std; 
   
  int test(int a); 
   
  void main(int argc,char* argv[])   
  { 
      couttestendl;//显示函数地址 
      int (*fp)(int a); 
      fp=test;//将函数test的地址赋给函数学指针fp 
      coutfp(5)""(*fp)(10)endl; 
  //上面的输出fp(5),这是标准c++的写法,(*fp)(10)这是兼容c语言的标准写法,两种同意,但注重区分,避免写的程序产生移植性问题! 
      cin.get(); 
  } 
   
  int test(int a) 
  { 
      return a; 
  }  typedef定义可以简化函数指针的定义,在定义一个的时候感觉不出来,但定义多了就知道方便了,上面的代码改写成如下的形式:#include iostream 
  #include string 
  using namespace std; 
   
  int test(int a); 
   
  void main(int argc,char* argv[])   
  { 
      couttestendl; 
      typedef int (*fp)(int a);//注重,这里不是生命函数指针,而是定义一个函数指针的类型,这个类型是自己定义的,类型名为fp 
      fp fpi;//这里利用自己定义的类型名fp定义了一个fpi的函数指针! 
      fpi=test; 
      coutfpi(5)""(*fpi)(10)endl; 
      cin.get(); 
  } 
   
  int test(int a) 
  { 
      return a; 
  } 更多内容请看C/C++技术专题专题,或   函数指针同样是可以作为参数传递给函数的,下面我们看个例子,仔细阅读你将会发现它的用处,稍加推理可以很方便我们进行一些复杂的编程工作。 !-- frame contents -- !-- /frame contents -- //-------------------该例以上一个例子作为基础稍加了修改----------------------------- 
  
   #include iostream   
  #include string   
  using namespace std;   
     
  int test(int);   
   
  int test2(int (*ra)(int),int); 
   
  void main(int argc,char* argv[])     
  {   
      couttestendl; 
      typedef int (*fp)(int);   
      fp fpi; 
      fpi=test;//fpi赋予test 函数的内存地址 
   
      couttest2(fpi,1)endl;//这里调用test2函数的时候,这里把fpi所存储的函数地址(test的函数地址)传递了给test2的第一个形参 
      cin.get(); 
  }   
     
  int test(int a) 
  {   
      return a-1; 
  } 
   
  int test2(int (*ra)(int),int b)//这里定义了一个名字为ra的函数指针 
  { 
      int c=ra(10)+b;//在调用之后,ra已经指向fpi所指向的函数地址即test函数 
      return c; 
  }   利用函数指针,我们可以构成指针数组,更明确点的说法是构成指向函数的指针数组,这么说可能就轻易理解的多了。#include iostream   
  #include string   
  using namespace std; 
   
  void t1(){cout"test1";} 
  void t2(){cout"test2";} 
  void t3(){cout"test3";} 
  void main(int argc,char* argv[])     
  { 
      void* a[]={t1,t2,t3}; 
      cout"比较t1()的内存地址和数组a[0]所存储的地址是否一致"t1""a[0]endl; 
   
      couta[0]();//错误!指针数组是不能利用数组下标操作调用函数的 
   
      typedef void (*fp)();//自定义一个函数指针类型 
      fp b[]={t1,t2,t3}; //利用自定义类型fp把b[]定义趁一个指向函数的指针数组 
      b[0]();//现在利用指向函数的指针数组进行下标操作就可以进行函数的间接调用了; 
      cin.get(); 
  }   仔细看上面的例子可能不用我多说大家也会知道是怎么一会事情了,最后我们做一个重点小结,只要记住这一点,对于理解利用函数指针构成数组进行函数间接调用就很轻易了! void* a[]={t1,t2,t3};
  cout"比较t1()的内存地址和数组a[0]所存储的地址是否一致"t1""a[0]endl;
  
  couta[0]();//错误!指针数组是不能利用数组下标操作调用函数的   上面的这一小段中的错误行,为什么不能这么调用呢?
  
  前一篇教程我们已经说的很清楚了,不过在这里我们还是复习一下概念,指针数组元素所保存的只是一个内存地址,既然只是个内存地址就不可能进行a[0]()这样地址带括号的操作,而函数指针不同它是一个例外,函数指针只所以这么叫它就是因为它是指向函数指向内存的代码区的指针,它被系统授予答应与()括号操作的权利,进行间接的函数调用,既然函数指针答应这么操作,那么被定义成函数指针的数组就一定是可以一样的操作的。 更多内容请看C/C++技术专题专题,
   或

来源:http://www.tulaoshi.com/n/20160219/1622497.html

延伸阅读
C++中的虚函数(一) 作者:aber     虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难。我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术。说明一点,写这篇文章只...
先看下面的程序: 代码如下: void main() {     int a = 100;     int *ap = &a;     printf("%p\n",&a);//输出:002AF744     printf("%p\n",ap);//输出:002AF744     printf("%d\n",*ap);//输出:100     printf("%p\n",&ap);//输出...
比如 一个函数 chat(link &a); chat(ling *a); 前者引入一个地址做形参 是不是可以把一个指针变量p。。 这么用chat(p); 那跟第二个函数 有什么区别呢 都是传地址啊。。 小弟弄不明白~~ chat(int&a); chat(int *a); 这两个函数是完全不同意义的东西,你的理解主要是在int&a和int* a这个类型上面。要注意int&和int*是两个完全不同的...
  在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。 以下两个例子要非常注重,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。 !-- frame contents -- !-- /frame contents -- #include stdio.h    void main(void)  {  ...
函数重载是用来描述同名函数具有相同或者相似功能,但数据类型或者是参数不同的函数管理操作的称呼! 我们来举一个实际应用中的例子来说明问题:我们要进行两种不同数据类型的和操作为了实现它,在c语言中我们就要写两个不同名称的涵数来进行区分例如:int testa(int a,int b)和float testb(float a,floatb),这样字是没有问题,但是总有一点不好,这...

经验教程

734

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部