| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1002 人关注过本帖
标题:自己动手给指针加 1,结果就看不懂*p 了
只看楼主 加入收藏
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
自己动手给指针加 1,结果就看不懂*p 了
//代码在最下边

在我这台机子加我这个编译器上,sizeof(3)的值是4,就是整型数据占4字节。
按我的理解,a[0]在内存中占32位,数值是1,就是前31位都是0,然后1个1;
a[1]在内存中占32位,前30位是0,后面跟2个1;
*p就是取a[0]的后24位加a[1]的前8位,结果是100000000b,就是256,怎么显示就成了33554432了呢?
求大神解答,一定是我有什么地方搞错了。

程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(){
    int a[3] = {1, 2, 3};
    int *p = a;
    p = 2686721;        //因为之前用printf显示出p的值是2868720,所以这里给他加上1

    printf("%d", *p);    //程序运行到这里显示结果33554432,是1后面跟25个0的二进制数

    return 0;
}
搜索更多相关主题的帖子: 编译器 
2014-09-23 15:14
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
此时对指针p+1并不能使指针偏移4个字节,原因我也不是很清楚,待我去查找下资料

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-23 15:50
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:7 
楼主先执行一遍,然后程序关闭,然后拿p的值去之前的地址取数?这是刻舟求剑

总有那身价贱的人给作业贴回复完整的代码
2014-09-23 15:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:13 
字节顺序 little-endian
2014-09-23 15:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
另外
p = 2686721
*p
属于未定义行为,因为 p 值没有字节对齐。
当然,在x86上没事,只是效率降低了而已,不会出现segment error,但你不要以为这是理所当然的。
2014-09-23 16:01
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
回复 5 楼 rjsp
学习了

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-23 16:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用wssy213在2014-9-23 16:16:34的发言:

学习了

主要是看4楼的内容,比如四字节长的整型值 0x12345678,其在内存中是如何存储的?这一点C/C++并没有作任何规定。
CPU主要有两种存储方式
第一种为 0x12、0x34、0x56、0x78;这种方式成为 big-endian
第二种为 0x78、0x56、0x34、0x12;这种方式成为 little-endian
在long long ago 还有其它稀奇古怪的存储方式

以little-endian举例
int a[3] = {1, 2, 3};
在内存中排布为 01 00 00 00, 02 00 00 00, 03 00 00 00
p 指向 00 00 00 02
*p 就是 0x02000000,即十进制的33554432

2014-09-23 16:29
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 4 楼 rjsp
我明白了
----------------------------------------------------

 0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0
 _ _ _ _ _ _ _ _   _ _ _ _ _ _ _ _ 
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|

假设上面分别是内存100单元和内存101单元里存储的数据,假设
short a[10];
并且正好a的地址是100
则a[0]的值是16384,因为对于x86处理器来说,他处理多字节数据是从右往左看的,先看右边字节的值。而对于单一的字节,他看里面的比特位的值也是从右往左看的,结果与我们从左往右看到的0000000000000010不同,X86处理器看到的值是0100000000000000B,翻译成十进制就是16384。

谢谢版主指点,这么基础又重要的东西C语言书上也不提,真是太不负责任了。

2014-09-23 16:44
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
回复 7 楼 rjsp
谢谢指点

坚持----------------------------------唯一的道路
shit ! ! !
2014-09-23 17:21
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
简单说说:
对于int *p;
    p = 2686721; 是不正规的,int -> int * 可以
 写成     p =(int *) 1245048;
   内存字节移动一个int数单位的长度,我想你是知道什么意思的,肯定是错位了,错位输出
2014-09-23 20:09
快速回复:自己动手给指针加 1,结果就看不懂*p 了
数据加载中...
 
   



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

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