为何将字符数组转int指针后,输出*pi得到“65 A”?
问题解答:为何int指针读取char数组得到65?
先看你的代码:
char c[4] = { 'A', '\0', '\0', '\0' }; int* pi = (int*)&c[0]; printf("%x %x %x %x\n", c[0], c[1], c[2], c[3]); printf("%x %x %x %x\n", *((unsigned char *)pi), *((unsigned char*)pi + 1), *((unsigned char*)pi + 2), ((unsigned char*)pi)[3]); printf("%d %c\n", (int)c[0], c[0]); printf("%d %c\n", *pi, (char)*pi);
你的理解误区出在字节序(endianness)上,现在绝大多数计算机都采用小端模式:
- 小端模式下,多字节数据的低字节会存在内存的低地址位置,高字节则存在高地址位置。
来看你的字符数组c的内存布局(地址从低到高排列):
| 内存地址 | 存储内容(十六进制) |
|---|---|
| &c[0] | 0x41('A'的ASCII值) |
| &c[1] | 0x00 |
| &c[2] | 0x00 |
| &c[3] | 0x00 |
当你把数组首地址&c[0]强制转换成int*类型后,*pi会把这连续4个字节当作一个int类型来读取。在小端模式下,这4个字节组合成的int值是0x00000041,转成十进制就是65,正好是'A'的ASCII码值。
如果是大端模式的机器(现在极少使用),*pi读取到的值会是0x41000000(十进制为68719476736),但这种情况几乎不会遇到。
你提到'A'不是数组的最后一个元素,但小端模式下int的最低有效字节对应数组的第一个元素,所以读取出来的int值自然就是65了。
内容的提问来源于stack exchange,提问作者ModernJason1
相关产品推荐
相关产品推荐

