指针的算术运算
100 104 108 112 116 120 124 128 132 136
10 | 2 | 3 | 4 | /0 | /0 | /0 | /0 | /0 | /0 |
关于指针的加法
Int arr[10]={1,2,3,4};
Int *p=10;
P++;
*p=20;
进行指针的加法运算时,当指针加一,会存在以下三种情况
1、 加一个字节
2、 加一个格子
3、 加一个数组
0a | 00 | 00 | 00 | 02 | 00 | 00 | 00 |
我们进行第一种情况的演示,在图中的格子中,因为是整型,则图中的4个格子中总共有40个字节,那么,在加上一个字节的情况下,一个大的格子总共有4个字节,也就是有4个小格子可以来存放数据
刚好存在8个位,则数字是以16进制的形式存放在格子中
大端:高地址放大的数据权重大的放在前面,大地址,一般应用在手机中比较多 小端:低地址放小的数据,权重小的放在前面,是小地址。一般应用在电脑中比较多,属于PC端 |
100 101 102 103 104 105 106 107
0a | 00 | 00 | 00 | 02 | 00 | 00 | 00 |
我们将10的十六进制转换出来,则为0x0000000a
在PC小端中,存放的数据结果应该是0a000000
在现在对应的2号格子中填入的数据应该变为20,跟前面一样,20的16进制数位0X00000014,而填入格子时应该变为0X14000000
0a | 14 | 00 | 00 | 00 | 00 | 00 | 00 |
我们假设,数组加1时是表示给原来的数组加上1个字节,这个时候我们的表示方法变如下图所示
在这种情况下,我们表示原来的1,2数据变成了0x0a1400和0x00000000
显然此种方法并不是我们所要求得的正确运算方式。所以,第一种方式,加一个字节显然是错误的。
对于指针加1就是加上一个数组的做法显然也是不现实的,所以综上所述,对于指针加1我们应该是加上1个格子,而格子的大小应该是权重的值。
Int *p=2000;
Printf(“%d\n”,p+4); 2004
Printf(“%\n”,(long *)p+4; 2016
Printf(“%\n”,(char *)p+4; 2004
Printf(“%\n”,(unsigned long long *)p+4; 2004
关于16进制减法的相关运算:
Int*p=0x2010;
Printf(“%x\n”,p-2)
Printf(“%\n”,(char*)p-2; 200e
Printf(“%\n”,(unsignedlong )p-2; 200e
Printf(“%\n”,(double*)p-2; 2008
Printf(“%\n”,(float*)p-2; 2008
Printf(“%\n”,(longlong **)p-2; 2008
Printf(“%d\n”,(short*)p-2; 200c
对于指针加指针 无意义 不能进行运算
对于指针减指针 有意义 表示中间间隔的格子数
总结:指针的所有算数运算都要进行调整,调整的权重为sizeof(指针去掉一个*)
另外关于字符串拷贝的一点
While(*des++=*src++)
指针减法运算的规则
正负值表示大小,1、算出字节数2、除以调整的权值
Int*p=&arr[1];
Int*p=&arr[9];
Printf(“%d\n”,p-q); -8
Printf(“%d\n”,q-p); 8
Pritnf(“%d\n”,(short*)q-(short *)p; 16
Pritnf(“%d\n”,(double*)q-(double *)p; 4
Pritnf(“%d\n”,(int***)q-(int ***)p; 8
Pritnf(“%d\n”,(char**)q-(char **)p; 8
Pritnf(“%d\n”,(long)q-(long)p; 32
因为9-1=8,int 类型的权值为4,则p和q之间便相差字节数为32,除以后面类型中格子的权值就可以了。