[应用相关] C语言问题

[复制链接]
1178|24
 楼主| wenfen 发表于 2019-3-8 17:55 | 显示全部楼层 |阅读模式

int a[5] = { 1, 2, 3, 4, 5 };
int *ptr2 = (int *)((int)a + 1);
printf("%x\n",  *ptr2);

运行结果是 2000000,这结果是怎么来的?
zhuhuis 发表于 2019-3-8 17:58 | 显示全部楼层
应该是小端法存储的问题,a[0]和a[1]在内存里应该是 01 00 00 00 02 00 00 00这样存的,ptr2指向的地址对应的数据是 00 00 00 02,所以按照小端法int型来读取就变成0x02000000
 楼主| wenfen 发表于 2019-3-8 18:02 | 显示全部楼层
还不是很明白,我试了试+2 结果 20000,+3 结果 200,+4 结果 2,+5 结果 3000000
tian111 发表于 2019-3-8 18:05 | 显示全部楼层
这个牵涉到存储和指针的问题。
chenho 发表于 2019-3-8 18:09 | 显示全部楼层

你吧指针转换成整数运算后又转换成指针。
tian111 发表于 2019-3-8 18:12 | 显示全部楼层
如果不能理解这样做的后果是什么就不要这么弄。
happy_10 发表于 2019-3-8 18:15 | 显示全部楼层
0x0000 0000         01 00 00 00
0x0000 0004         02 00 00 00
0x0000 0008         03 00 00 00
0x0000 000C         04 00 00 00

假设a=0x00000000,(int)a,a就是0,(int)a+1就是1,指向地址0x00000001的int型数据(连续4个byte)就是 00 00 00 02,小端存储,就是0x02000000;
如果变成+2,a就是等于2,指向地址0x00000002地址的int型数据就是 00 00 02 00,
然后自己计算吧。
lium 发表于 2019-3-8 18:20 | 显示全部楼层
这里本来a是个地址,或者说是指针。 但你 (int)a 强转后的结果便是一个整型数据了,它再加1就是只加1而不是加4了。
spark周 发表于 2019-3-8 18:22 | 显示全部楼层
如果你写成 (int *)(a + 1); 那又不一样了,此时加1则是加1个INT宽度4,此时读得数据时a[1];
spark周 发表于 2019-3-8 18:26 | 显示全部楼层

你得分大端模式还是小端模式
shimx 发表于 2019-3-8 18:30 | 显示全部楼层

高位数据存储在高位地址还是低位地址
liliang9554 发表于 2019-3-8 18:33 | 显示全部楼层
int *ptr2 = (int *)((int)a + 1);
zyf部长 发表于 2019-3-8 18:35 | 显示全部楼层
像这种编程的用法在单片机编程中常用吗
huwr 发表于 2019-3-8 18:39 | 显示全部楼层

个人风格问题。不存在常用不。
huanghuac 发表于 2019-3-8 18:42 | 显示全部楼层
arm下,指针对不齐,有问题,
zhuhuis 发表于 2019-3-8 18:45 | 显示全部楼层
这个代码还可以顺便用来判断系统的存储的大小端模式,哈哈哈~
songqian17 发表于 2019-3-8 18:48 | 显示全部楼层

这代码如果在ARM指令下,会死得很惨
chenho 发表于 2019-3-8 18:51 | 显示全部楼层
种东西,面试时经常会见到...
tian111 发表于 2019-3-8 18:55 | 显示全部楼层
超出了A的取值范围,把RAM不知的地方取进来了。
dingy 发表于 2019-3-8 18:58 | 显示全部楼层
sizeof(a)=10,sizeof(a[0])=2,明白这点,就问题就明白了。这样的指针写法不好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

737

主题

8940

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部