#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 并不挨着,它们中间还参杂了别的辅助数据。
本文链接:http://task.lmcjl.com/news/8275.html