1. 先说字节序,大端和小端,大端是高字节在低位,小端是低字节在低位
int a = 0x12345678;
char *p = (char *)&a;
int i;
printf("%x %x\n", a, &a);
for (i = 0; i < sizeof(int); i++) {
printf("%x %x\n", *p, p);
p++;
}
从上图可以看出,我的编译环境是小端
2. 再说数组和指针
这两个类型有点像异卵双胞胎,说像又不像~~
2.1
int a[] = { 0x1, 0x2, 0x3, 0x4 };
printf("%x %x %x\n", a, &a, &a[0]);
看起来值都一样,但是它们代表的意思可不太一样
a -- 数组首元素的地址
&a -- 数组首地址
&a[0] -- 数组首元素的地址
有本书上的比喻比较形象:&a是湖南省省政府,&a[0]是长沙市市政府,二者都在长沙市。
2.2
再来加深一下印象
int a[] = { 0x1, 0x4, 0x8, 0x12 };
printf("%x %x %x\n", *a, *a + 1, *(a + 1));
a是数组首元素的地址,*a是其值,*a + 1是加法,*(a + 1)是*(a + 1 * sizeof(int))
2.3
int a[4] = { 0x1, 0x4, 0x8, 0xB };
printf("%x %x %x\n", a, *(&a + 1), *((int *)&a + 1));
*(&a + 1)为啥在首地址偏移16个字节那?因为&a是数组首地址,&a + 1是 &a + 1 * sizeof(a),而a是个数组,sizeof(a)就是其自身大小
*((int *)&a + 1)和上一节的*(a + 1)类似