【5】指针的加减数字运算及其指针加减

数据类型必须是严格相同的,才可以赋值的。


1.指针的加减数字 指的是指针在数组中的位置移动

2.加减规则:指针加减法需要调整。调整的权重是指针本身去掉一个*号,再求sizeof();



加法示例:



 int *p = (int *)1000; 

//定义一个整型指针变量p赋值为16进制数0x1000;


 printf("%d\n",p+2);//1008 

//去掉一个*,属于int型,sizeof(int)是4,即1000+2*sizeof(int) = 1008;


 printf("%d\n",(char ***)p+2);//1008

去掉一个*,为char**,二维指针,sizeof()为4,1000+2*4 = 1008;


 printf("%d\n",(short *)p+2);//1004

去掉一个*,属于short型,sizeof()为2,1000+2*sizeof(short) = 1004;


 printf("%d\n",(double **)p+2);//1008

去掉一个*,还是指针变量,sizeof()为4,1000+2*4 = 1008;


 printf("%d\n",(unsigned long *)p+2);//1008

去掉一个*,属于unsigned long,sizeof()为4,1000+2*sizeof(unsigned long) = 1008;


 printf("%d\n",(char *)p+2);//1002

去掉一个*,属于char型,sizeof()为1,1000+2*sizeof(char) = 1002;


 printf("%d\n",(unsigned long long)p+2);//1002

不是指针变量,不用求sizeof,直接1000+2 = 1002;

法示例:


//定义一个整型指针变量p赋值为16进制数0x1000;

     int *p = (int *)0x2010;     //转换为二进制该数10两位是16


 printf("%x\n",p-2);//2008

//去掉一个*,属于int型,sizeof(int)为4,那么为2016-2*sizeof(int)=2008;


 printf("%x\n",(float *)p-2);//2008

// 去掉一个*,属于float型,sizeof(float)为4,那么2016-2*sizeof(folat) = 2008


 printf("%x\n",(double *)p-2);//2000

//去掉一个*,属于double型,sizeof(double)为8,2016-2*sizeof(double) = 2000


 printf("%x\n",(short *)p-2);//200c

//去掉一个*,属于short型,sizeof(short)为2,2016-2*sizeof(short) = 200c


 printf("%x\n",(unsigned long *)p-2);//2008

//去掉一个*,属于unsigned long型,sizeof()为4,那么2016-2*4 = 2008;


 printf("%x\n",(long *)p-2);//2008

去掉一个*,属于long型,sizeof(long)为4,那么2016-2*sizeof(long) = 2008


 printf("%x\n",(long long)p-2);//200e

其不是指针变量,所以直接2016 - 2 = 2014,十六进制用200e表示


 printf("%x\n",(char *)p-2);//200e

去掉一个*,属于char型,sizeof(char)为1,2016-2*sizeof(char)=200e;


指针+指针是非法的


指针-指针:

//指针-指针:间隔的单元个数,需要调整,调整的权重位sizeof(指针去掉一个*)
//指针-指针的计算:1、计算间隔的字节数,2、除以权重


     int arr[10] = {0};
 int *p = &arr[1];//x+4
 int *q = &arr[7];//x+28


 printf("%d\n",p-q);//-6

p-q的间隔字节数为-24,-24/sizeof(int) = -6


 printf("%d\n",q-p);//6

q-p的间隔字节数为24,24/sizeof(int)= 6


 printf("%d\n",(short *)q-(short *)p);//12

q-p的间隔字节数为24,24/sizeof(short)= 12


 printf("%d\n",(long long*)q-(long long *)p);//3

q-p的间隔字节数为24,24/sizeof(long long )= 3


 printf("%d\n",(double *)q-(double *)p);//3

q-p的间隔字节数为24,24/sizeof(double)= 3


 printf("%d\n",(unsigned long)q-(unsigned long)p);//24

其不是指针变量,直接q-p即可,即答案为24;


 printf("%d\n",(char **)q-(char **)p);//6

q-p的间隔字节数为24,去掉一个*,char*为指针变量,占有4个字节,即24/4 = 6;




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值