对指针的一个使用思考

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

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


 

#include 
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;
}

输出结果图为:

对指针的一个使用思考_第1张图片

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

而后面的那些输出主要是针对int有四个字节,long强制转型后+1再变回整型指针相当于指针移动了一位,所以后面我一直+到4,就是为了方便理解。

你可能感兴趣的:(C语言)