您的位置 首页 设计

C言语的那些小秘密之函数指针

我们经常会听到这样的说法,不懂得函数指针就不是真正的C语言高手。我们不管这句话对与否,但是它都从侧面反应出了函数指针的重要性,所以我们还是有必要掌握对函数指针的使用。先来看看函数指针的定义吧。

  咱们常常会听到这样的说法,不懂得函数指针就不是真实的C言语高手。咱们不论这句话对与否,可是它都从旁边面反响出了函数指针的重要性,所以咱们仍是有必要把握对函数指针的运用。先来看看函数指针的界说吧。

  函数是由履行句子组成的指令序列或许代码,这些代码的有序调集依据其巨细被分配到必定的内存空间中,这一片内存空间的开始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的进口地址,为了便利操作类型特点相同的函数,c/c++引入了函数指针,函数指针便是指向代码进口地址的指针,是指向函数的指针变量。 因而“函数指针”自身首要应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整形变量、字符型、数组相同,这里是指向函数。C在编译时,每一个函数都有一个进口地址,该进口地址便是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量相同,在这些概念上是共同的。函数指针有两个用处:调用函数和做函数的参数。

  函数指针的声明办法为:

  数据类型标志符 (指针变量名) (形参列表);

  “函数类型”阐明函数的回来类型,因为“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后边的“形参列表”表明指针变量指向的函数所带的参数列表。例如:

  int function(int x,int y); /* 声明一个函数 */

  int (*f) (int x,int y); /* 声明一个函数指针 */

  f=function; /* 将function函数的首地址赋给指针f */

  赋值时函数function不带括号,也不带参数,因为function代表函数的首地址,因而通过赋值今后,指针f就指向函数function(int x,int y);的代码的首地址。

  下面的程序阐明晰函数指针调用函数的办法:

  例一、

  #include

  int max ( int x, int y){ return x>y?x:y;}

  int min ( int x, int y){ return x

  void main ()

  { int ( *f ) ( int x, int y)=max;

  //f=&max;

  printf ( "%d,%d\t", max (2,6), (f)(5,4));

  f=min;

  printf (" %d,%d\t" , min (2,6), (f)(5,4));

  }

  留意:以上代码的赤色部分咱们将会在接下来的代码剖析部分进行解说,读者也能够考虑下假如运转注释部分,成果是否仍是正确的呢?

  f是指向函数的指针变量,所以可把函数max()赋给f作为f的值,即把max()的进口地址赋给f,今后就能够用f来调用该函数,实际上f和max都指向同一个进口地址,不同便是f是一个指针变量,不像函数称号那样是死的,它能够指向任何函数,就看你想怎样做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因而能够先后指向不同的函数。不过留意,指向函数的指针变量没有++和–运算,用时要当心。

  函数括号中的形参可有可无,视情况而定,不过,在某些编译器中这是不能通过的。这个比如的弥补如下。

  1.界说函数指针类型:

  typedef int (*fun_ptr)(int,int);

  2.声明变量,赋值:

  fun_ptr max_func=max;

  也便是说,赋给函数指针的函数应该和函数指针所指的函数原型是共同的。

  例二、

  #include

  void FileFunc()

  {

  printf("FileFunc\n");

  }

  void EditFunc()

  {

  printf("EditFunc\n");

  }

  void main()

  {

  typedef void (*funcp)();

  funcp pfun= FileFunc;

  pfun();

  pfun = EditFunc;

  pfun();

  }

  看了上面两段代码,应该都知道如何用函数指针来调用函数了,可是咱们刚刚在上面的描绘中留下过一个问题,便是运转注释部分f=&max;成果是否仍是正确的呢?下面我就给出上面两个运转成果的对别,然后来剖析下原因。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/116808.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部