打印
[STM32F1]

C语言问题

[复制链接]
648|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenfen|  楼主 | 2021-2-1 23:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

运行结果是 2000000,这结果是怎么来的?

使用特权

评论回复
沙发
zhuhuis| | 2021-2-1 23:50 | 只看该作者
应该是小端法存储的问题,a[0]和a[1]在内存里应该是 01 00 00 00 02 00 00 00这样存的,ptr2指向的地址对应的数据是 00 00 00 02,所以按照小端法int型来读取就变成0x02000000

使用特权

评论回复
板凳
wenfen|  楼主 | 2021-2-1 23:52 | 只看该作者
还不是很明白,我试了试+2 结果 20000,+3 结果 200,+4 结果 2,+5 结果 3000000

使用特权

评论回复
地板
tian111| | 2021-2-1 23:55 | 只看该作者
这个牵涉到存储和指针的问题。

使用特权

评论回复
5
chenho| | 2021-2-1 23:57 | 只看该作者
你吧指针转换成整数运算后又转换成指针。

使用特权

评论回复
6
tian111| | 2021-2-1 23:58 | 只看该作者
如果不能理解这样做的后果是什么就不要这么弄。

使用特权

评论回复
7
纪国圣| | 2021-2-2 07:36 | 只看该作者
假设a[0]存储的地址为0x00,则a[0]在单片机中的存储分布如下:
地址     数据
0x00    01       a[0]
0x01    00
0x02 00
0x03 00
0x04 02       a[1]
0x05 00
0x06 00
0x07 00
0x08 03       a[2]
0x09 00
0x0A 00
0x0B 00
(int)a+1指的是a的地址先转为int类型数,然后做加一操作。指针指向地址0x01,那么在取指之后得到的结果为:
0x01 00
0x02 00
0x03 00
0x04 02
即0x02000000
同样(int)a+2与(int)a+3原理都是一样的。
而a+1则表示a[1]。

使用特权

评论回复
8
happy_10| | 2021-2-3 21:08 | 只看该作者

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,
然后自己计算吧。

使用特权

评论回复
9
lium| | 2021-2-3 21:12 | 只看该作者
这里本来a是个地址,或者说是指针。 但你 (int)a 强转后的结果便是一个整型数据了,它再加1就是只加1而不是加4了。

使用特权

评论回复
10
spark周| | 2021-2-3 21:15 | 只看该作者
如果你写成 (int *)(a + 1); 那又不一样了,此时加1则是加1个INT宽度4,此时读得数据时a[1];

使用特权

评论回复
11
spark周| | 2021-2-3 21:17 | 只看该作者
你得分大端模式还是小端模式

使用特权

评论回复
12
shimx| | 2021-2-3 21:19 | 只看该作者
高位数据存储在高位地址还是低位地址

使用特权

评论回复
13
liliang9554| | 2021-2-3 21:28 | 只看该作者
int *ptr2 = (int *)((int)a + 1);

使用特权

评论回复
14
zyf部长| | 2021-2-3 21:31 | 只看该作者
像这种编程的用法在单片机编程中常用吗

使用特权

评论回复
15
huwr| | 2021-2-3 21:33 | 只看该作者
个人风格问题。不存在常用不。

使用特权

评论回复
16
huanghuac| | 2021-2-3 21:37 | 只看该作者
arm下,指针对不齐,有问题

使用特权

评论回复
17
zhuhuis| | 2021-2-3 21:40 | 只看该作者
这个代码还可以顺便用来判断系统的存储的大小端模式,哈哈哈~

使用特权

评论回复
18
songqian17| | 2021-2-3 21:43 | 只看该作者
这代码如果在ARM指令下,会死得很惨

使用特权

评论回复
19
chenho| | 2021-2-3 21:45 | 只看该作者
种东西,面试时经常会见到...

使用特权

评论回复
20
tian111| | 2021-2-3 21:47 | 只看该作者
超出了A的取值范围,把RAM不知的地方取进来了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

737

主题

8940

帖子

8

粉丝