指针的算术运算

(1)指针+-数字

指针+1:意为加一个单元格

指针加减数字,需要调整,调整的权重为sizeof(指针去掉一个*)

int main()
{

int *p1 = (int *)2000;

printf("%d\n",p1+4);   //2016

int arr[10] = {1,2,3};

int *p = arr;        //int

*p = 10;

p++;         //加一个int单元格,4字节

*p = 20;

double brr[5] = {12.3,34.5,56.7};

double *dp = brr;      //double

dp++;          //加一个单元格,8字节

*dp = 100;

char crr[5] = "abc";

char *cp = crr;     //char *cp = "abcde";   //char

cp++;     //加一个单元格,1字节

*cp = 'x';

return 0;

}

练习:

加法:

int main()
{

int *p = (int *)2000;

printf("%d\n",p+4);                     //2000+4*4=2016

printf("%d\n",(short *)p+4);       //2000+4*2=2008

printf("%d\n",(double *)p+4);   //2000+4*8=2032

printf("%d\n",(float **)p+4);    //去掉一个*为指针,在32为平台运行,2000+4*4=2016

printf("%d\n",(unsigned short *)p+4);    //2000+4*2=2008

printf("%d\n",(long *)p+4);    //2000+4*4=2016

printf("%d\n",(char *)p+4);   //2000+4*1=2004

printf("%d\n",(unsigned long long)p+4);    //2000+4=2004,注意此处已经不是指针类型

        return 0;

}

减法算法和加法同理:

//注意,16进制借1当16

int main()
{

int *p = (int *)0x2010;

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

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

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

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

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

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

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

printf("%x\n",(unsigned long )p-2);   //200e,注意此处类型不是指针

return 0;

}

(2)指针-指针

间隔的单元格数,不是字节数

计算方法:1、算出字节数;2、除以调整的权重

结果有正负,正负只是表示它们的地址大小

int main()
{

int arr[10] = {1};

int *p = &arr[1];    //x+4

int *q = &arr[9];   //x+36

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

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

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

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

printf("%d\n",(int ***)q-(int ***)p);   //8

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

printf("%d\n",(long)q-(long)p);   //32,注意此处已不再是指针类型

return 0;

}

总结:指针的所有算术运算都需要调整,调整的权重为sizeof(指针去掉一个*)

(3)‘[ ]’自带解引用

int *p;

p=arr;

int arr[10]={1,2,3};

p[i]==*(p+i);

int *p=arr;

*(arr+i)==arr[i];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值