| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 353 人关注过本帖
标题:这个为什么是由大到小的排列的顺序
只看楼主 加入收藏
菜鸟杨力
Rank: 1
来 自:陕西宝鸡
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-5-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
这个为什么是由大到小的排列的顺序
图片附件: 游客没有浏览图片的权限,请 登录注册
# include <stdio.h>
int main()
{
    int a,b,c;
    int *p1=&a,*p2=&b,*p3=&c;
    printf("请输入两个数字:\n");
    scanf("%d %d %d",&a,&b,&c);
    printf("a的值是%d\nb的值是%d\n",a,b);
    printf("a的地址是:%d\nb的地址是:%d\nc的地址是:%d\n",p1,p2,p3);
    printf("p1-1的地址是:%d\n",p2);
    return 0;
}




那个地址为什么不是由小到大排列呢 本人还是个菜鸟 各路大仙 指点指点
  
搜索更多相关主题的帖子: include return 
2011-09-02 15:39
penghao511
Rank: 2
来 自:安徽
等 级:论坛游民
帖 子:23
专家分:25
注 册:2011-9-1
收藏
得分:10 
内存是随机分配的。
如果是数组的话就会是一段连续的内存空间。
2011-09-02 15:48
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:5 
a,b,c是自动变量,程序运行期间在栈上,栈是从高地址向下分配的。是不是这个道理?
请输入两个数字:
1 2 3
a的值是1
b的值是2
a的地址是:0xbff55adc
b的地址是:0xbff55ad8
c的地址是:0xbff55ad4


如果把a,b,c放到main函数之外,那么就成了全局变量。就不在栈上了,因此地址大小发生了变化。
请输入两个数字:
1 2 3
a的值是1
b的值是2
a的地址是:0x804a024
b的地址是:0x804a028
c的地址是:0x804a02c


另外提醒一下楼主,输出指针的值用%p,不要%d

[ 本帖最后由 pauljames 于 2011-9-2 22:15 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-09-02 22:06
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:5 
程序代码:
2:    int main()
3:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,58h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-58h]
0040102C   mov         ecx,16h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
4:        int a,b,c;
5:        int *p1=&a,*p2=&b,*p3=&c;
00401038   lea         eax,[ebp-4]                //这里是为变量a分配内存,它的地址即ebp-4=p1
0040103B   mov         dword ptr [ebp-10h],eax    //将地址变量(指针p1)放到ebp-10h内存单元中即&p1=ebp-10h
0040103E   lea         ecx,[ebp-8]                //同上p2=ebp-8
00401041   mov         dword ptr [ebp-14h],ecx
00401044   lea         edx,[ebp-0Ch]               //p3=ebp-12
00401047   mov         dword ptr [ebp-18h],edx        

6:        printf("请输入两个数字:\n");
0040104A   push        offset string "\xc7\xeb\xca\xe4\xc8\xeb\xc1\xbd\xb8\xf6\xca\xfd\xd7\xd6:\n" (00424014)
0040104F   call        printf (00401190)
00401054   add         esp,4
7:        scanf("%d %d %d",&a,&b,&c);
00401057   lea         eax,[ebp-0Ch]
0040105A   push        eax
0040105B   lea         ecx,[ebp-8]
0040105E   push        ecx
0040105F   lea         edx,[ebp-4]
00401062   push        edx
00401063   push        offset string "%d %d %d" (00424008)
00401068   call        scanf (0040fa20)
上面是一段用VC++6.0反汇编得到的代码。
可以看到p1=ebp-4,p2=ebp-8,p3=ebp-12
这样应该好理解了吧
2011-09-02 23:03
菜鸟杨力
Rank: 1
来 自:陕西宝鸡
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-5-12
收藏
得分:0 
回复 3楼 pauljames
谢谢
2011-09-04 22:48
快速回复:这个为什么是由大到小的排列的顺序
数据加载中...
 
   



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

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