| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5042 人关注过本帖
标题:关于数组首地址的问题?
只看楼主 加入收藏
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:9 
关于数组首地址的问题?
在数组中为什么数组的首地址不可以自加,但又为什么可以加偏移量?
2017-02-22 20:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏
得分:0 
地址自加是什么意思?
2017-02-22 20:51
宇宙规律
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:232
专家分:128
注 册:2014-5-7
收藏
得分:3 
一:数组在内存是一组连续的地址
比如,你声明了个数组
int a[5];
这里有5个数组元素,第一个元素的下标为0,依此类推:1,2,3,4
偏移量就是指相对于数组第一个元素的偏移值
比如,偏移量为2
那么此时应该指向是 a[1]

二、数组名和指针的关系
这个问题是个历史性的问题了,在C语言中,数组名是当作指针来处理的。更确切的说,数组名就是指向数组首元素地址的指针,数组索引就是距数组首元素地址的偏移量。理解这一点很重要,很多数组应用的问题就是有此而起的。这也就是为什么C语言中的数组是从0开始计数,因为这样它的索引就比较好对应到偏移量上。
2017-02-22 20:57
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
收藏
得分:0 
a不是代表数组的首地址嘛,但a++是不被允许,因为书上说他是一个常量,但为什么他可以与自己的偏量相加a+1
2017-02-22 20:58
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:2 
数组名是地址常量,常量是不能自加变化的,但常量可以参与计算,所以让它和偏移量相加是可以的。
2017-02-22 21:01
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:3 
int num[5];
假如num的地址是0x78901234,每个整型是4个字节,num[1]的地址就是0x78901238
地址自加 0x7890134 + 1 = 0x78901235
你认为0x78901235有什么意义?
2017-02-22 21:13
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:1 
a+1 和 a++的区别。

前者没有副作用,后者有副作用。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-22 21:13
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10551
专家分:42996
注 册:2014-5-20
收藏
得分:11 
a[10],数组名a表达的是存储这组数的基址。a++意味着想要改变这个基址,这个基址改变了,这个数组就失去原来的意义。同时,系统对这块存储空间的管理就有可能出现混乱,有可能不能正常释放被占用的资源。而a+1并没有改变这个基址,只是表达偏移基址一个数据块。

再想想:
    char *p=malloc(10);
    p++;
    free(p);
会是什么情况?
2017-02-23 06:23
核心利益
Rank: 2
等 级:论坛游民
威 望:2
帖 子:19
专家分:44
注 册:2016-12-31
收藏
得分:0 
这主要涉及到数组的存储:数组是一个整体,在内存中占连续的一段存储单元;
int num[5];//int是类型符表示是整型;num是数组名;[5]是常量表达式,表示此数组有5个整型元素。
在C语言中,数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中首元素(即序号为0的元素)的地址;数组名不代表整个数组,只代表首元素的地址;
每个整型是4个字节,num[1]的地址是数组中的下一个元素的地址,(在首元素num[0]的基础上加上4个字节);系统会根据数组的类型(此处为int整型)将其值加4;(4个字节是一个整体,不可分开);
地址自加 0x7890134 + 1 = 0x78901235 ,这里加1,这里的1只是代表单纯的数值,而num[1]代表下标为1 的元素的地址。

2017-02-23 10:08
johnzsj
Rank: 2
等 级:论坛游民
帖 子:54
专家分:27
注 册:2017-2-10
收藏
得分:0 
回复 9楼 核心利益
我懂了,谢谢
2017-02-23 10:43
快速回复:关于数组首地址的问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.079717 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved