为何通过char*打印int数组的输出为1000、2000?请解惑
程序输出1000和2000的原因解析
关键细节拆解
- int的字节长度:当前运行环境中
int类型占4个字节,所以数组t的总大小sizeof(t)为2 * 4 = 8字节,循环会执行8次。 - 小端字节序存储:系统采用小端模式存储多字节数据——即多字节数值的低字节会被放在内存的低地址处。
- 数组里的整数
1,在内存中按字节拆分后是:0x01、0x00、0x00、0x00(对应十进制的1、0、0、0) - 数组里的整数
2,在内存中按字节拆分后是:0x02、0x00、0x00、0x00(对应十进制的2、0、0、0)
- 数组里的整数
- char指针的逐字节访问:代码中将int数组的地址强制转为
char*类型,这使得*(p+i)会逐个读取数组的每个字节(而非直接读取int元素)。 - 打印逻辑:循环中每次直接打印当前字节的十进制值,没有分隔符,所以前4次打印的内容会连在一起变成
1000;当i等于3(第一个int的最后一个字节索引)时执行换行。后4次打印同理,连在一起变成2000后换行。
附加验证
如果修改代码,给每个打印的字节加空格,就能看到拆分后的单个数字:
int main() { int t[] = { 1, 2 }; char* p = (char*)t; int i; for (i = 0; i < sizeof(t); i++) { printf("%d ", *(p + i)); if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n"); } return 0; }
此时输出会变为:
1 0 0 0 2 0 0 0
内容的提问来源于stack exchange,提问作者YitengXU_
相关产品推荐
相关产品推荐

