指针的算术运算

指针的算术运算             

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=8int 类型的权值为4,则pq之间便相差字节数为32,除以后面类型中格子的权值就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章