博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
extern int *a与extern int a[]
阅读量:6804 次
发布时间:2019-06-26

本文共 800 字,大约阅读时间需要 2 分钟。

extern int *a与int a[]

Table of Contents

1 问题:

以下的声明取自某个源文件:

int a[10];int *b=a;

但在还有一个不同的源文件里,却发现了这种代码:

extern int *a;extern int b[];int x,y;x=a[3];y=b[3];

请解释,当两条赋值语句运行时会发生什么?

2 解答:

  1. 指针是变量,系统会为每一个变量开辟存储空间,包含指针变量
  2. 数组名神似指针,一些情况下可视为指向数组第一个元素的指针(所以定义的数组声明时被声明为指针也是能够的,仅仅只是声明文件里代表指针用了),可是实际上数组名是"实实在在"的"地址",表示的是存储数组元素的空间的起始位置,系统不会为数组名本身开辟存储空间(&数组名得到的地址还是数组名)
  3. 对待一个变量i,取出变量的内容步骤能够视为:1).找到变量i的地址(&i) 2).取出&i地址起i类型那么大空间的内容作为变量i的值

在第一个赋值中。编译器觉得a是一个指针变量,所以它提取存储在那里的指针值,并加上12(3和整型的长度相乘),然后对这个结果运行间接訪问操作。但a实际上是整型数组的起始位置,所以作为"指针"获得的这个值实际上是数组的第一个整形元素。它与12相加。其结果解释为一个地址。然后对它进行间接訪问。作为结果,它或者将提取一些随意内存位置的内容。或者因为某种地址错误而导致程序失败。

在第2个赋值中。编译器觉得b是个数组名,所以它把12加到b的存储地址,然后间接訪问操作从那里获取的值。其实。b是个指针变量,所以从内存中提取的后面的第三个int实际上是从另外的随意变量中取得的。这个问题说明了指针和数组尽管存在关联。但绝不是同样的。

Author: kirchhoff

Created: 2014-11-10 Mon 22:13

24.4.1 ( mode 8.2.10)

转载地址:http://rdjwl.baihongyu.com/

你可能感兴趣的文章
linux 7.2 安装openstack 过程出现rabbitmq-server 错误解决方法
查看>>
PHP CI框架学习笔记-分页实现程序
查看>>
提升不止一点点,Dubbo 3.0 预览版详细解读,还愣着干啥啊?进来啊
查看>>
磁盘配额(quota)
查看>>
php同步mysql两个数据库中表的数据
查看>>
Sequence of transform scripts?
查看>>
网络分流器-网络分流器-网络流量监控技术及其方法
查看>>
elasticSearch6安装
查看>>
大数据生态之zookeeper(典型应用场景)
查看>>
PDF文件怎么添加页眉页脚,有什么简单的方法吗?
查看>>
游戏的飞跃进展
查看>>
好程序员web前端技术分享移动端页面布局
查看>>
Oracle 10g新增列方式指定HINT
查看>>
RAC 环境下参数文件(spfile)管理
查看>>
Tomcat优化
查看>>
Linux系统启动过程故障排查
查看>>
linux下常用命令
查看>>
canvas drag 实现拖拽拼图小游戏
查看>>
返回一个首尾相连的整数数组中最大子数组的和数
查看>>
线程安全和线程不安全的理解
查看>>