函数名&函数名取地址

转自http://my.oschina.net/mavericsoung/blog/174110

有时看到如下的代码: 

01 /*****************************/
02 #include <stdio.h>
03 #include <string.h>
04 #include <stdlib.h>
05  
06 void test()
07 {
08     printf("123456\n");
09 }
10  
11 int main(int argc, char *argv[])
12 {
13     printf("0x%x\n",test);
14     printf("0x%x\n",&test);
15 }
16  
17 [root@localhost pht]# ./a.out
18 0x8048328
19 0x8048328
按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做, 
c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。 

因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址, 
它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针! 


跟此问题类似的还有对一个数组名取地址。 
int a[100]; 
printf("%p\n", a); 
printf("%p\n", &a[0]); 

打印值一样。 
但是数组名a,指向的是具有100个int类型的组数; 
&a[0]指向的是元素a[0]。 
即他们的值相同,但指向的类型不同。 

标准在其rationale中解释了这个问题,摘录如下: 
6.5.3.2 Address and indirection operators  
Some implementations have not allowed the & operator to be applied to an array or a function.  
(The construct was permitted in early versions of C, then later made optional.) The C89 Language  
Committee endorsed the construct since it is unambiguous, and since data abstraction is  
enhanced by allowing the important & operator to apply uniformly to any addressable entity.  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值