指针计算详解

int main()
{
    int a[5] = { 1,2,3,4,5 };
    int* ptr = (int*)(&a + 1);//&a+1 跳过整个数组后的地址 数组类型转换后存入*ptr
    printf("%d\n", *(ptr - 1));//ptr-1 解引用获得的是a[5] 的值 

    p = (struct test*)0x100000;
    printf("struct大小=%d\n", sizeof(*p));//结构体大小是 24
    printf("%p\n", p + 0x1);//p+1 跳过整个结构体大小 0x100018(十六进制)
    printf("%p\n", (unsigned long)p + 0x1);//将0x100000 强制转换位long整型 +1 就是实际值+1
    printf("%p\n", (unsigned int*)p + 0x1);//将p结构体类型强制转换成int*类型,+1 就是跳过四个字节

    int* ptr1 = (int*)(&a + 1);//&a+1 跳过整个数组后得到的地址转换成int* 指针存放在 ptr1里
    int* ptr2 = (int*)((int)a + 1);//a位首元素地址,转换成int类型一个十六进制的值 再+1
                                   //转换成int* 指针存放入ptr2 此时+1 表示向后移动一个字节
    printf("%x,%x\n", ptr1[-1], *ptr2);//ptr1[-1]=*(ptr1 - 1) 此时解引用访问的是a[4] 值为5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值