指针的算术运算

1.指针加法:加几就是加几个单元格

指针加法需要调整,调整的权重是指针本身去掉一个 * 号,再求sizeof()

int *p ; p+1 就是要加4(sizeof(int)*1)个字节

double *p; p+2就是加8(sizeof(double)*2)个字节


int main()

{
 int arr[10]={1,2,3,4,5,6,7,8,9,10};
 int *p=arr;
 *p=10;
 p++; //相当与p+1,加4个字节,因为int *去掉* 是int,占四个字节
 *p=20;
 printf("%d,%d\n",arr[0],arr[1]); //10,20
 int *p = (int *)10000;
 printf("%d\n",p+1);  //10004  
 printf("%d\n",p+4);  //10016
 printf("%d\n",(char *)p+4);  //10004   1*4
 printf("%d\n",(short *)p+4);   //10008   2*4
 printf("%d\n",(double *)p+4);   //10032   8*4
 printf("%d\n",(double **)p+1);  //10004   去掉一个* 变成double *,是一个指针,加四个字节
 printf("%d\n",(unsigned long long )p+1);  //10001  强转成一个数,不是指针了,数字加一就好
 printf("%d\n",(int ***)p+1);  //10004  去掉一个*后,是int **,是一个指针,加四个字节
 return 0;
}

2.指针减法:减几就是减几个单元格
指针减法也需要调整,调整的权重和加法一样,指针本身去一个* 号,再求sizeof()
int main()
{
 int *p=(int *)0x1010;   //注意是十六进制,涉及到了十六进制的减法
 printf("%x\n",p-1);     //100c
 printf("%x\n",p-2);     //1008
 printf("%x\n",(short *)p-2);  //100c
 printf("%x\n",(char *)p-2);   //100e
 printf("%x\n",(double *)p-2);  //1000
 printf("%x\n",(float *)p-2);    //1008
 printf("%x\n",(long long)p-2);  //100e
 printf("%x\n",(double **)p-2);  //1008
 printf("%x\n",(char **)p-2);      //1008
 return 0;
}

3.指针不能加指针
int *p=(int *)100;
int *q=(int *)110;
p+q ;//error
因为没有意义,就相当与一个月的27号和一个月的二号相加,不知道加出的是什么,因为没有意义,指针加法也是这样,是非法的,因为没有意义

4.指针可以减指针
运算过程:
(1)算出两个指针的间隔的字节数
(2)除以指针的权重,和指针加减数字的算法一样,权重就是去掉一个* 号以后,求sizeof();

int arr[10] = {0};//x
 int *p = &arr[1];//x+4
 int *q = &arr[9];//x+36   
//我们不需要知道具体的地址是多少,因为不管地址是多少,都是相差8*4=32个字节,知道字节就求出第一步了
 printf("%d\n",p-q);//-8
 printf("%d\n",q-p);//8
 printf("%d\n",(short *)q-(short *)p);//16
 printf("%d\n",(char **)q-(char **)p);//8
 printf("%d\n",(double *)q-(double *)p);//4
 printf("%d\n",(long *)q-(long *)p);//8
 printf("%d\n",(char *)q-(char*)p);//32
 printf("%d\n",(long long)q-(long long)p);//32

(3)不同类型的指针不能相减
 printf("%d\n",(int *)q-(short *)p);//error







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值