温故而知新--数组和指针

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)类似

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值