经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C/C++知识分享:函数名和取地址的区别以及联系
来源:cnblogs  作者:大天使维迦  时间:2021/1/4 9:45:56  对本文有异议

有时看到如下的代码: 

  1. /*****************************/
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include <stdlib.h>
  5.  
  6. void test(){printf("123456\n");}
  7. int main(intargc,char*argv[])
  8. {printf("0x%x\n",test);
  9. printf("0x%x\n",&test);}
  10. [[emailprotected]pht]# ./a.out 0x80483280x8048328

 

 


 

按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做, c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。

如果你也想成为程序员,想要快速掌握编程,赶紧关注小编加入学习企鹅圈子吧!

里面有资深专业软件开发工程师,在线解答你的所有疑惑~编程语言入门“so easy”

资料包含:编程入门、游戏编程、课程设计等。

免费学习书籍:


 

免费学习资料:


 

 因此,对于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. 

原文链接:http://www.cnblogs.com/zuishuaideou/p/14201654.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号