有这样一段C语言:
#include <stdio.h>
int main(void){
int x = 3;
int *p = &x ;
printf("*p = %d\n",*p);
printf("(*p)++ = %d\n",(*p)++);
printf("*(p++) = %d\n",*(p++));
printf("*p++ = %d\n",*p++);
return 0 ;
}
输出结果:
*p = 3
(*p)++ = 3
*(p++) = 4
*p++ = 1703808
下面来分析一下出现这个结果的原因:
*p = 3 , 这个输出很正常,因为p指向x,x的值为3,所以解引用*p的值为3
(*p)++ = 3 , 这里先输出*p的值, 又因为*p = x ;所以相当于x++操作, 所以第二句执行完后x的值变为4(这里的++操作已经是针对x了,不是针对指针p的++操作)
*(p++) = 4 ,这里先执行*p,再执行p++操作,有人会问,p++操作明明是用括号括起来了,怎么不是先执行p++操作, 这里我猜测是由于++的前置和后置的区别引起的, 括号对他们不管用,这里我如果将*(p++) 改成*(++p), 输出结果是1703808(十进制的地址值), 说明这里*(++p)确实先执行了指针的++操作, 导致输出操作后执行,而p的后一个地址的值是不确定的
*p++ = 1703808, 这里由于第三句输出完*p后,指针地址++操作,p已经指向了原来地址的后一个地址,而后一个地址的值不确定,所以这里的操作是先输出后一个地址的值,然后后一个地址再自增
看下面几副执行图:
这里表示++操作是针对指针的
这里表示++操作是针对*p也就是x的
从上面两幅图的执行结果可以看出++p和p++操作是不同的执行顺序, 前置++p先执行p的自增操作,后置p++,后执行p++操作
这里我还有一点不太明白, 就是p自增后, 再输出*p为什么是1703808, 希望看到这篇文章的同学可以为我解惑.