指針的算術運算

指針的算術運算             

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,除以後面類型中格子的權值就可以了。

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