#include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c); printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); //加法運算 pa++; pb++; pc++; printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); //減法運算 pa -= 2; pb -= 2; pc -= 2; printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); //比較運算 if(pa == paa){ printf("%d\n", *paa); }else{ printf("%d\n", *pa); } return 0; }運行結果:
&a=0X28FF44, &b=0X28FF30, &c=0X28FF2B pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B pa=0X28FF48, pb=0X28FF38, pc=0X28FF2C pa=0X28FF40, pb=0X28FF28, pc=0X28FF2A 2686784從運算結果可以看出:pa、pb、pc 每次加 1,它們的地址分別增加 4、8、1,正好是 int、double、char 類型的長度;減 2 時,地址分別減少 8、16、2,正好是 int、double、char 類型長度的 2 倍。
pa++;
使得地址加 1 的話,就會變成如下圖所示的指向關系:pa++;
使得地址加 4 的話,正好能夠完全跳過整數 a,指向它後面的內存,如下圖所示:#include <stdio.h> int main(){ int a = 1, b = 2, c = 3; int *p = &c; int i; for(i=0; i<8; i++){ printf("%d, ", *(p+i) ); } return 0; }在 VS2010 Debug 模式下的運行結果為:
3, -858993460, -858993460, 2, -858993460, -858993460, 1, -858993460,
可以發現,變量 a、b、c 並不挨著,它們中間還參雜了別的輔助數據。