有时看到如下的代码:

/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>void test()
{printf("123456\n");
}int main(int argc, char *argv[])
{printf("0x%x\n",test);printf("0x%x\n",&test);
}[root@H3C]# ./a.out
0x7025368
0x7025368

按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&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.

转载于:https://www.cnblogs.com/still-smile/p/11592292.html

C语言函数名以及取地址的区别和联系相关推荐

  1. C语言对函数取地址,C语言函数名以及取地址的区别和联系

    有时看到如下的代码: /*****************************/ #include #include #include void test() { printf("123 ...

  2. c语言函数名本质是指针,C语言的本质(12)——指针与函数

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...

  3. c语言为什么scanf要取地址printf不用呢?

    我的猜测是 因为要引入指针的概念就必须引入地址的概念 而scanf这种赋值类的 就好像存东西也需要寄存柜的号码一样吧 也需要"地址" 不过scanf这种取地址应该也是可以交给机器判 ...

  4. 关于符号用于引用与取地址的区别

    符号&有多种用法,这篇文章讨论其作为引用与取地址的区别. 1.&作为引用:可理解为给变量取别名 int a=6;int &b=a; 声明了b是a的一个引用,是a的一个专属别名, ...

  5. C语言中 指针变量 取地址符的用法 *指针变量名的用法

    文章目录 总结 Intro Code 图示 总结 众所周知,内存可以看成一个一个相邻的格子(类比Excel),而数据就存储于这些格子之中(size大的变量占用格子数多,size小就占用小).而每个格子 ...

  6. c语言 如何对数组取地址,C语言 对数组名取地址

    作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 演示样例: int a[5] = {1,2,3,4,5}; int *p = (int * ...

  7. C语言 什么时候用取地址什么时候不用取地址,符号讲解

    情况一: &是一个取地址运算符 &a是一个表达式,其功能是求变量a的地址 scanf函数的一般形式为:scanf("格式控制字符串",地址列表); scanf输入的 ...

  8. 数组名和数组名取地址的区别

    原文地址:http://blog.csdn.net/daniel_ice/article/details/6857019 以下代码会打印出什么样的日志呢? [cpp]view plaincopypri ...

  9. C语言函数名与函数指针详解

     二.通常的函数调用一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main( ...

最新文章

  1. sqlservcer行列互转
  2. matlab语法手册下载,MATLAB及其在理工课程中的应用指南 第4版.pdf
  3. python具体工作内容_有没有人知道公司里用python工作的内容有什么
  4. [html] 举例说明HTML5出来后,有哪些HTML标签被弃用了?
  5. python使用sql读取数据表并返回dataframe
  6. 2019年江苏省计算机一级考试题目和答案,江苏省计算机等级考试一级2019年(春)...
  7. mail linux 客户端,Nylas Mail: 一个 Linux 的免费邮件客户端
  8. CS20Chapter2
  9. Kafka负载均衡、Kafka自定义Partition、Kafk文件存储机制
  10. 2PC 二阶段提交协议与3PC
  11. Online Safe Trajectory Generation For QuadrotorsUsing Fast Marching Method and Bernstein Basis Polyn
  12. carla--使用python进行carla交互仿真
  13. React native大版本迭代信息记录
  14. 解决番茄插件visual assist x 不能安装的问题
  15. 数据挖掘实战(4)——聚类(Kmeans、MiniBatchKmeans、DBSCAN、AgglomerativeClustering、MeanShift)
  16. KETTLE实现循环批量多表抽取添加字段
  17. 魔法少女小Scarlet
  18. 树莓派3代发布支持蓝牙WiFi:售35美元
  19. Android第三方流式布局FlowLayout简单实用(搜索历史记录)
  20. Python之pandas:利用describe函数统计【类别型】特征/离散型变量的描述性统计信息(包括个数count、unique、top及其freq、first、last)之详细攻略

热门文章

  1. erlang 读取confg文件异常 could not start kernel pid error in config file
  2. jquery图片预加载+自动等比例缩放插件
  3. 【Java 集合】ArrayList、LinkedList、Stack、Queue、Set、Map, 迭代器 Iterable、Iterator,Collections类
  4. Linux运维问题解决(1)——Linux 定时任务 crontab 配置及示例
  5. 决策树剪枝算法(二)
  6. 心得总结:一名优秀的数据分析专家的能力模型
  7. 使用xcode4做ios的国际化
  8. js常用内建对象之:Array
  9. list(链表)容器
  10. docker java 最小镜像_Docker多步构建更小的Java镜像