#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位。
C语言之数组和指针位移的本质(四十五)
猜你喜欢
转载自blog.csdn.net/u010164190/article/details/123434001
今日推荐
周排行