指针的算术运算

一、指针加法 指针加法需要调整,调整的权重为指针本身去掉一个* < 解一次引用去掉一个*,得到一个格子>,然后求sizeof:指针p+-n 实际加的地址为p+-n*sizeof((*p)) 指针减法同加法
二、指针-指针    
int *p = &arr[1];
int *q = &arr[3];
p + q; //false 指针+指针 两个门牌号相加,错误
q - p; //true 结果是它们之间的间隔单元个数,并不是字节数
1、算出间隔的字节数
2、除以调整的权重
3、奋斗重点*(arr+i) == arr[i] p[i] == *(p+i)
有可能是负数,把它还原成 *(p+i)——-i
tip: []自带* 即arr[i]自带解引用
4、p(指针)与arr(数组)的区别?
      (1)大小不同 p:4B arr[10]:10个字节(char)
       (2)p++; //true arr++; //false
5、while(*des++ = *src++); // ;表示空语句 利用最后一个'\0'为0的特点
/* 参照 int main()
int a = 10;
if(a = 100) //若a != 0 为真,打印a的值:a = 100;a = 0为假,不打印
        {
                printf("%d\n",a);
}
*/
6、C语言发明人对指针+1的猜测
(1)加一个字节
(2)加一个单元格
(3)加整个数组
tips: PC 小端:低地址放小数据
int  arr[10] = {1,2,3,4,5,6};
int *p = arr;
*p = 10;
p++;
*p = 20;
printf("%d,%d\n",arr[0],arr[1]);
printf("%x\n",arr[0]); //140a

绿色格子里的数字是:14 00 00 00 20(10进制)——14(16进制)
三、一些小知识
1、16进制:0 1 2 3 4 5 6 7 8 9 a b c d e f
2、int 2B; unsigned long(无符号长整型) 4B; long long 8B; float 4B; double 8B; short 2B; long 4B
四、考
1、int *p = (int *)100;
printf("%d\n",p+2);//108
printf("%d\n",(char **)p+2);//108
printf("%d\n",(short *)p+2);//104
printf("%d\n",(long long *p)+2);//116
printf("%d\n",(float *)p+2);//108
printf("%d\n",(double *)p+2);//116
printf("%d\n",(unsigned long)p+2);//102 无*,所以不是指针,而是数字
2、int *p = (int *)0x2010;
printf("%x\n",p-2);//2008 0x2010-2*4 = 2008
printf("%x\n",(char *)p-2);//200e
printf("%x\n",(short **)p-2);//2008
printf("%x\n",(long *)p-2);//2008
printf("%x\n",(double *)p-2);//2000
printf("%x\n",(long long)p-2);//200e
3、int arr[10] = {};
int *p = &arr[1];
int *q = &arr[9];
printf("%d\n",p-q);//-8
printf("%d\n",q-p);//8
printf("%d\n",(char *)q-(char *)p);//(9*4-1*4)/1 = 32
printf("%d\n",(char ***)q-(char ***)p);//(9*4-1*4)/4=8
printf("%d\n",(short *)q-(short *)p);//(9*4-1*4)/2=16
printf("%d\n",(int)q-(int)p);//4*9-4*1=32 不是指针型,而是数字,所以不遵循指针相减规律
printf("%d\n",(double *)q-(double *)p);//(4*9-4*1)/8=4
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@所谓伊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值