C语言之数组和指针位移的本质(四十五)

#include <iostream>
using namespace std;

int main(){
	int stu[5] = {10,20,30,40,50};
	int *p1 = &stu[2];
	int *p2 = &stu[1];

	printf("isub = %ld\n",p1 - p2);//int类型移动了2位
	//1.char*(stu)
	printf("(char*)stu = %p, (char*)stu+1 = %p, (char*)stu+2 = %p, (char*)stu+3 = %p, (char*)stu+4 = %p\n",(char*)stu,(char*)stu+1,(char*)stu+2,(char*)stu+3,(char*)stu+4);
	printf("csub = %ld\n",(char*)p1 - (char*)p2);//char类型移动了8位
	
	//2.stu
	printf("stu = %p, stu+1 = %p, stu+2 = %p, stu+3 = %p, stu+4 = %p\n",stu,stu+1,stu+2,stu+3,stu+4);
	//等价于
	//3.stu[0]
	printf("&stu[0] = %p, &stu[1] = %p, &stu[2] = %p, &stu[3] = %p, &stu[4] = %p\n",&stu[0],&stu[1],&stu[2],&stu[3],&stu[4]);
	
	//其实是地址位移相减;以下是向后位移N个int(4byte)地址,【即位移的int类型的个数.】
	printf("(stu+1) - stu = %ld\n",(stu+1)-stu);//位移1个int地址,即位移了int类型大小的个数.
	printf("(stu+2) - stu = %ld\n",(stu+2)-stu);//位移2个int地址	
	

	//等价于
	printf("(&stu[1]) - (&stu[0]) = %ld\n",(&stu[1])-(&stu[0]));//位移1个int地址
	printf("(&stu[4]) - (&stu[0]) = %ld\n",(&stu[4])-(&stu[0]));//位移4个int地址
	printf("(&stu[0]) - (&stu[4]) = %ld\n",(&stu[0])-(&stu[4]));//位移4个int地址
	printf("len = %ld\n",sizeof(p1));//8byte
}


注意:不管是数组相邻元素地址相减,还是指针类型相减,占位符是%d表示int(占4个byte)类型
      说明是以int类型,也就是4个字节为单位位移,如果向前/后移动1个4字节,就说位移一位;
      如果向前/后移动2个4字节,则说移动2位。

猜你喜欢

转载自blog.csdn.net/u010164190/article/details/123434001