解释倒是能解释:
看那个数组在内存里的样子(只有前两个有影响)
1 2 的二进制码分别是(括号里的是十六进制表示,逗号分隔字节):
0000 0000
0000 0000
0000 0000
0000 0001 (00,00,00,01)
0000 0000
0000 0000
0000 0000
0000 0010 (00,00,00,02)
intel 的字节序是 little-endian,也就是说存在内存里的是这个样子:
!0000 0001
!0000 0000
0000 0000
0000 0000 (
!01
!00,00,00)
0000 0010
0000 0000
0000 0000
0000 0000 ( 02,00,00,00)
a 本来指向的 1 的起始,也就是上面红色叹号的位置。加一之后,向后挪了一个字节也就是蓝色叹号那里。再输出 int 就是从那里取四个字节,是 (00,00,00,02) 由 little-endian 便是十六进制的 2000000。
但这种写法是危险的,结果也不具有移植性。
有些机器或者编译器对数据段的数据有严格的对齐限制:a 是 int 类型,所以 a 的齐起始地址在内存里一定是 4(即 sizeof(int))的整数倍。向前进了一字节后,地址被4除余一,在这个地址上进行 int 的读取操作会引发寻址异常。通常程序会表现为段错误。