在程序中,*++p和++*p会产生什么样的结果,如何理解和区分?
简单分析,在*++p中,++符号位于指针p前面,是前置运算符,我们可以理解为p先做自增,然后进行解引用,指向++p中存储的值;而在++*p中,是先对指针p进行解引用,取出p所指向的内存空间存储的值,然后再对这个值进行自增。
为了验证这个结果,我们可以进行简单编程:
1 #include<stdio.h>
2
3 int main() {
4 int a[] = {1, 3, 5, 7, 9};
5 int *p = a + 2;
6 printf("p=%p\n", p);
7 printf("*++p=%d\n", *++p);
8 printf("p=%p\n", p);
9 printf("++*p=%d\n", ++*p);
10 printf("p=%p\n", p);
11 return 0;
12 }
定一个数组a,然后将这个数组的第三个元素a[2]的地址赋给指针p,首先输出p的值,接着*++p的值以及经过运算后的p的值,最后再输出++*p的值以及经过运算后的p的值,前后进行对比,结果如下:
p=0xbfa89100
*++p=7
p=0xbfa89104
++*p=8
p=0xbfa89104
从输出结果可以看出,a[2]的地址是0xbfa89100,*++p的值是7,是数组中第四个元素,此时p的值是0xbfa89104,与a[2]的地址刚好相差一个int长度,因此*++p是先对p进行自增,然后进行解引用。
++*p的值是8,是数组中第四个元素7自增1的结果,这时指针p的值仍然是0xbfa89104,说明指针没有动,只是将指针指向的数值取出来,然后进行自增运算。