关于指针问题:int强转short*为什么输出0 0 3 4 5

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/144150048396173.jpg "#left"

int arr[ ]={1,2,3,4,5};

int强制转换成short ,访问两个字节,由原来的一个空间四个字节变为两个字节,*(p+i)=0,i自增四次,一次增加一个空间,一个空间两个字节,不应该是0 0 0 0 5吗,为什么是0 0 3 4 5,为什么是增加1是增加一个字节呢,int*里面也会是以字节存储的吗。脑子已经乱掉了,请mogul解答

空间还是那个空间大小, 原来是int 型,一个数组元素占4个字节长度, 强转成 short 类型指针,一个short数据只能访问 2个字节的空间。
然后再看 *(p + i) , 这个 p 是 short 类型指针, p 只能访问 原来 int型的前两个字节,(p + 0) = 0 和 *(p + 1) = 0 要这两个才能把原来 一个int的数据都改成 0.,也就是 最后改了 前两个 int的数据。
最终输出 0 0 3 4 5

int arr[ ]={1,2,3,4,5};
其中1占用了4个字节,2占用了另外4个字节
循环4次,每次2个字节,因此把这两个数字都弄成了0
后面3 4 5不变
有什么问题。

int arr[ ]={1,2,3,4,5};
内存里 1:01 00 00 00
内存里 2:02 00 00 00

内存里 3:03 00 00 00
内存里 4:04 00 00 00
内存里 5:05 00 00 00
p是short指针,占两个字节
循,1,2次修改了原来内存1的数据:
内存里 1:00 00 00 00
内存里 2:02 00 00 00
内存里 3:03 00 00 00
内存里 4:04 00 00 00
内存里 5:05 00 00 00
循环3,4次又修改了原来内存2的数据:
内存里 1:00 00 00 00
内存里 2:00 00 00 00
内存里 3:03 00 00 00
内存里 4:04 00 00 00
内存里 5:05 00 00 00
所以最后输出是:0 0 3 4 5

【以下回答由 GPT 生成】

为什么输出结果不是我期望的0 0 0 0 5,而是0 0 3 4 5?

输出结果不是期望的0 0 0 0 5,而是0 0 3 4 5,是因为强制类型转换改变了指针的步长,从而导致对应的数据读取错误。在强制转换后,short指针对数组的每一次偏移只增加了2个字节而不是4个字节,而数组中的元素大小是4个字节(int类型),所以后面的元素读取出现了错误。

一次增加一个空间时,为什么增加的是3个字节而不是2个字节?

增加的不是3个字节,而是2个字节。在强制类型转换时,将int指针转换为short指针后,short指针每次对数组进行偏移时,增加的是2个字节。这是因为short类型在内存中占据2个字节,而int类型在内存中占据4个字节。

int指针中的存储方式是按字节还是按字存储的?

int指针中的存储方式是按字存储的。int类型在内存中占据4个字节,字节顺序根据系统的存储结构(大端序或小端序)有所不同。在C语言中,整型数据存储是按字存储(字节从低地址到高地址)的。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^