新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > C语言的那些小秘密之函数指针

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

作者:时间:2015-03-04来源:网络收藏

  有注释前的运行结果为:

本文引用地址:http://www.eepw.com.cn/article/270442.htm

  

 

  把注释部分加进去的运行结果为:

  

 

  对比以上的运行结果可以看出,f=&max语句被执行时的结果和没有被执行时的结果是一样的。为什么会出现这样的结果呢?答案是这是编译器处理的,max本身就是个地址,它没有放到任何变量里,自然没有取它的地址一说。所以我们可以看看在调试的过程中&max的值和max的值是一样的。调试代码如下:

  root@ubuntu:/home/shiyan# gdb ss

  GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2

  Copyright (C) 2010 Free Software Foundation, Inc.

  License GPLv3+: GNU GPL version 3 or later

  This is free software: you are free to change and redistribute it.

  There is NO WARRANTY, to the extent permitted by law. Type "show copying"

  and "show warranty" for details.

  This GDB was configured as "i686-linux-gnu".

  For bug reporting instructions, please see:

  ...

  Reading symbols from /home/shiyan/ss...done.

  (gdb) list

  1 #include

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

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

  4 void main ()

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

  6 //f=&max;

  7 printf ( "%d,%dt", max (2,6), (f)(5,4));

  8 f=min;

  9 printf (" %d,%dt" , min (2,6), (f)(5,4));

  10 }

  (gdb) b 4

  Breakpoint 1 at 0x80483ec: file hanshu.c, line 4.

  (gdb) r

  Starting program: /home/shiyan/ss

  Breakpoint 1, main () at hanshu.c:5

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

  (gdb) print max

  $1 = {int (int, int)} 0x80483c4

  (gdb) print f

  $2 = (int (*)(int, int)) 0xbffff6c8

  (gdb) s

  7 printf ( "%d,%dt", max (2,6), (f)(5,4));

  (gdb)

  max (x=5, y=4) at hanshu.c:2

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

  (gdb) print max

  $3 = {int (int, int)} 0x80483c4

  (gdb) print &max

  $4 = (int (*)(int, int)) 0x80483c4

  (gdb) print *max

  $5 = {int (int, int)} 0x80483c4

  (gdb) s

  max (x=2, y=6) at hanshu.c:2

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

  (gdb) s

  main () at hanshu.c:8

  8 f=min;

  (gdb) print min

  $6 = {int (int, int)} 0x80483d3

  (gdb) print &min

  $7 = (int (*)(int, int)) 0x80483d3

  (gdb) print *min

  $8 = {int (int, int)} 0x80483d3

  (gdb) s

  9 printf (" %d,%dt" , min (2,6), (f)(5,4));

  (gdb) print f

  $9 = (int (*)(int, int)) 0x80483d3

  (gdb) print &f

  $10 = (int (**)(int, int)) 0xbffff6ac

  (gdb) print *f

  $11 = {int (int, int)} 0x80483d3

  (gdb) s

  min (x=5, y=4) at hanshu.c:3

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

  (gdb) s

  min (x=2, y=6) at hanshu.c:3

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

  (gdb) print min

  $12 = {int (int, int)} 0x80483d3

  (gdb) s

  main () at hanshu.c:10

  10 }

  在调试的过程中我print了很多的信息,细心的读者肯定能获得更多的收获,尤其是对变量f的print,读者可以自己阅读,学到更多的东西。我给出的只是一个参考的调试方式,希望读者能够举一反三,自己对代码进行实际的调试,加深理解。

  上面说的都是用来实现的调用,接下来我们看一个用作为参数的用法。

  #include

  using namespace std;

  typedef int (*print)(int );

  int fun1(int i)

  {

  return (int)i;

  }

  void fun2(int j,print prt)

  {

  for(int k=0;k

  cout<<'t'<

  }

  void main()

  {

  int i=10;

  fun2(i,fun1);

  }

  运行结果如下:

  

 

  看了上面的描述,我想都对的概念有了大致的了解,另外一个希望大家不要混淆的概念就是指针函数,,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型,即为void),只不过指针函数返回类型是某一类型的指针。

  其定义格式如下所示:

  返回类型标识符 *返回名称(形式参数表)

  { 函数体}

  返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”,关于函数的返回值问题我将在下一章来讲解,本章到此为止。希望以上内容对你有所帮助!

  博大精深,由于本人水平有限,博客中的不妥或错误之处在所难免,殷切希望读者批评指正。同时也欢迎读者共同探讨相关的内容,如果乐意交流的话请留下你宝贵的意见。

c语言相关文章:c语言教程


c++相关文章:c++教程



上一页 1 2 下一页

关键词: C语言 函数 指针

评论


相关推荐

技术专区

关闭