免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4073 | 回复: 11
打印 上一主题 下一主题

函数的名称到底是什么?指针、地址? [复制链接]

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-07 15:30 |只看该作者 |倒序浏览
可以这样使用(C中)

  1. void f(){};
  2. void (* pf ) () =f
复制代码
也可以这样使用(c++中)

  1. class ClassName
  2. {
  3.     public:
  4.         void foo(int a){printf("foo%d\n",a);}
  5. };
  6. typedef void (ClassName::* FUNC)(int);

  7. FUNC ptr = &ClassName::foo;
复制代码
一个没加&,一个加了,为什么啊?

论坛徽章:
0
2 [报告]
发表于 2010-09-07 15:42 |只看该作者
回复 1# ecjtubaowp


    我觉得和变量名字 和int a一样;

论坛徽章:
0
3 [报告]
发表于 2010-09-07 15:48 |只看该作者
波粒二象性~~

论坛徽章:
0
4 [报告]
发表于 2010-09-07 15:51 |只看该作者
赞同2楼。

C那段,按理说是应该加&的,不过C对这个处理很灵活,不加也不会错。使用函数指针,pf()和(*pf)(),理论上应该是后一种,但前一种一样不会出错,而且看起来更自然。

论坛徽章:
0
5 [报告]
发表于 2010-09-07 15:58 |只看该作者
函数名是汇编里一个代码片断的标识。相当于goto 里的标签。也代表代码片断的第一条指令的存放的地址。
如:
  1. test:
  2.         pushl        %ebp
  3.         movl        %esp, %ebp
  4.         subl        $16, %esp
  5.         movl        $1, -4(%ebp)
  6.         movl        -4(%ebp), %eax
  7.         leave
  8.         ret
  9.         .size        test, .-test
复制代码
函数的指针里存放着函数名标识的代码片段中的首地址。
  1. int (*f)(void) = test;
复制代码
在汇编里是这么实现的。
  1. movl        $test, -8(%ebp)
复制代码
  1. (*f)();
  2.     f();
复制代码
调用相当于:
  1. movl        -8(%ebp), %eax
  2. call        *%eax
复制代码

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
6 [报告]
发表于 2010-09-07 16:03 |只看该作者
还是懂点汇编好。

论坛徽章:
0
7 [报告]
发表于 2010-09-07 16:03 |只看该作者
函数名就是该函数的首址

论坛徽章:
0
8 [报告]
发表于 2010-09-07 16:07 |只看该作者
回复 7# ahui886


    有道理。就是这样

论坛徽章:
0
9 [报告]
发表于 2010-09-07 17:02 |只看该作者
回复 8# zhangsuozhu


    赞同~~

论坛徽章:
0
10 [报告]
发表于 2010-09-07 19:27 |只看该作者
1) The name of a function is an identifier;
2) The function will be implicitly converted into a pointer to a function where necessary.

Consider arrays:

1) The name of an array is an identifier;
2) The array will be implicitly converted into a pointer to an object where necessary.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP