对指针的一个使用思考

这次思考是为了感受一下指针对int型的输出的影响,顺便测试一下本机的栈是递增还是递减的。

因为我的Ubuntu是64bit的,所以这里使用了long来使用,而不是int,否则会因为部分地址丢失导致结果出现段错误。


 

#include <stdio.h>
int main()
{
        printf("%d\n",sizeof(long));  // 这里是测试long的字节大小
        int a[4] = {1,2,3,4};
        int *ptr1 = (int *)(&a+1);    // &a是取整个数组,当它+1,就会移动sizeof(int a[4])位
        int *ptr2 = (int *)((long)a+1);
        int *ptr3 = (int *)((long)a+2);
        int *ptr4 = (int *)((long)a+3);
        int *ptr5 = (int *)((long)a+4);
        printf("ptr[-1]=%#x\n", ptr1[-1]);
                       // 数组下标是可以取负数的,实际上,取下标符“[ ]”的内部实现,就是指针运算
                       // a[0] == *(a+0),则ptr1[-1] == *(ptr1-1)
        printf("ptr[-1]=%d\n", ptr1[-1]);
        printf("%x\n", *ptr2);
        printf("%x\n", *ptr3);
        printf("%x\n", *ptr4);
        printf("%x\n", *ptr5);
        return 0;
}

输出结果图为:

ptr[-1]还是很好理解的,之前&a+1移动了sizeof(int a[4])位再往回走1个sizeof(int)位,很明显就是输出4;

而后面的那些输出主要是针对int有四个字节(其实这里的地址就是小端模式),long强制类型转换后+1,你就当成数学计算题,+1就好,再强制类型转换变成整型指针,相当于指针移动了一个字节,所以后面我一直+到4,就是为了方便理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值