这次思考是为了感受一下指针对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,就是为了方便理解。