您的位置:首页 > 其它

指针的算术运算

2017-08-07 15:48 169 查看
一、指针加法
指针加法需要调整,调整的权重为指针本身去掉一个* < 解一次引用去掉一个*,得到一个格子>,然后求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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针算术