2. 指针是内存地址,本质就是一个数字,它表示从0x00起内存的位置。
所以,如果a=0x00,p=a+5,那p就是0x05,表示内存的第5字节。
这是很方便的。
4. 想看指针到底指向内存的哪里,可以这样:
char *a="abcd";
char *b=a+3;
printf("a=%d\nb=%d\n",(int)a,(int)b);
也许,你得到的结果会令你惊讶的。如果你发现b<a,不要惊讶,因为大部分电脑都是倒着存储和读写数据的,在内存中,实际上是"dcba"
5. 指针不是数据,它只是数据的地址,它告诉了我们数据的类型和位置。
所以,指针+n得到一个指向当前数据之后的第n个数据,指针-n相反。
对于不同类型的指针,加减实际偏移的字节数是不同的。比如
int a[2];
int *b;
b=&a[0]+1;
此时,*b和a[1]是等效的。而&a[0]+1实际上把a[0]的地址加了4字节,这是一个int的长度。
6. 嗯,指针和整形数相加还是指针,指针与指针相减就成整形数了。
7. 老虎是集大成者,说的好广、好深,我们上学期学的C。指针加整数n,表示指向后移n位。比如题中数组a,假设这样定义:
a[10]={1,2,3,4,5,6,7,8,9,0};
int *p1=a,*p2;
int num;
p2=p1 4;//则此时,指针p2指向a[4]
printf("%d",*p2);//则输出结果为: 4
num=p2-p1;
printf("%d",num);//此时输出为:4
8. 呃,代码第六行 p2=p1 4;,加号打成空格了,应该是: p2=p1+4;
9. 啊啊啊啊啊啊,又写错了,
printf("%d",*p2);//则输出结果为: 4
输出结果应该是:5。
10. 由7楼也可以推出5楼的结论。因为int是4字节的(我不知道VC++是不是,它可能是2字节,但手机的int都是4字节),那么
(int)p2 - (int)p1
的结果应该是16
如果int是2字节,结果就是8