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