| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1041 人关注过本帖
标题:数组地址问题
只看楼主 加入收藏
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
结帖率:71.43%
收藏
已结贴  问题点数:20 回复次数:7 
数组地址问题
程序代码:
# include <stdio.h>

int main(void)
{
int a[5] = {2222,2666,35888,4,5};
int *p=a;                           //指针被赋值a的首地址即a【0】为什么输出却提前4个字节

printf("%d\n", &a[0]);
printf("%d\n", &a[1]);
printf("%d\n", &a[2]);
printf("%d\n", a);
printf("%d\n", &p+1);
printf("%d\n", &p);                //指针被赋值a的首地址即a【0】为什么输出却提前4个字节
printf("%d\n", *p);                //值却是正确的。

return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: color 
2017-02-13 17:52
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:5 
printf("%d\n", &p+1);

因为你这段代码是错的,你这是在地址上+1,&运算符比二元运算符+优先级更高。

所以你这段代码实际上是 (&p)+ 1

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-13 18:10
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
回复 2楼 renkejun1942
renkejun1942 不加1输出的p指向的地址也不对,而且是减少了4个字节


我是硬件工程师
2017-02-13 18:30
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
我懂了,&p的概念被我弄混了。通过这个例子我看到指针p的位置在数组前面4个字节。不知道是不是每次都这样。

我是硬件工程师
2017-02-13 18:40
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
我用别的pelles编译后看到p也在数组的前面4个字节,哈哈,大家都试试,来交流一下有没有不是这样的。

[此贴子已经被作者于2017-2-13 18:49编辑过]


我是硬件工程师
2017-02-13 18:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
这有啥
疑问吗

DO IT YOURSELF !
2017-02-13 20:58
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:5 
我要是编译器我也把变量挨着个儿放,这不是很合逻辑么?

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2017-02-13 22:08
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:5 
程序代码:
# include <stdio.h>

int main(void)
{
int a[5] = {2222,2666,35888,4,5};
int *p=a;                   //指针赋值给p

printf("%d\n", &a[0]);    //打印a0的地址,以Int的形式
printf("%d\n", &a[1]);    //打印a1的地址,以Int的形式
printf("%d\n", &a[2]);    //打印a2的地址,以Int的形式
printf("%d\n", a);    //打印a的地址,以Int的形式
printf("%d\n", &p+1);    //打印p指针变量的地址,并不是p所指的地址,而且是+1运算,而a刚好在p的下一个高位内存上。
printf("%d\n", &p);    //说明p的地址高于a,证明了数据的地址是从小往大方向放数据的。
printf("%d\n", *p);    //输出*p等于p0,也等于a0,2222。

return 0;
}



[此贴子已经被作者于2017-2-14 12:02编辑过]

2017-02-14 12:01
快速回复:数组地址问题
数据加载中...
 
   



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

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