#include
int main()
{
int a[]={1,2,3,4,5};
int p=a;
printf("a1=%d\n",*p);
printf("b=%d\n",(++p));
printf("a2=%d\n",*p);
printf("c=%d\n",*(p++));
printf("a3=%d\n",*p);
printf("d=%d\n",(*p)++);
printf("a4=%d\n",*p);
printf("e=%d\n",*p--);
printf("a5=%d\n",*p);
printf("f=%d\n",--(*p));
printf("a6=%d\n",*p);
}
为什么输出结果是:a1=1,b=2,a2=2,c=2,a3=3,d=3,a4=4,e=4,a5=2,f=1,a6=1
求教大神 关于指针移动问题 谢谢
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 尚书左仆射 2016-06-16 10:29关注
主要是操作符优先级问题;操作符结合性问题和++、--的前置后置问题。
首先,++、--和*(解引用)都是右结合性的,也就是从右到左结合。
其次,后置的++、--要比前置的++、--和*(解引用)优先级高。
最后,后置++、--返回的是没有变化前的值;而前置++、--返回的是变化后的值。
a1我相信你没问题;
b = (++p);先把p指针向后移了一个元素的距离,再取值。此时p指向的是a1,值为2.
a2再次取p指向的值,还是a[1]的值
c = *(p++);后置操作返回的还是为改变前的值,既此时p还是指向a[1],所以c的值依旧为2.但是该语句结束后p将指向a2
a3取到了a[2]的值为3
d = (*p)++;此时后置++是作用于*P的,p本身没有变化。由于是后置d取到的未改变时的值,即a[2] = 3,该语句结束后a[2]的值被该为4
a4再次取到a[2]的值,此时为4
e = *p--;这个时候就要用到右结合性了,从右到左结合,即先有p--,该语句相当于(p--)。取到a[2]的值为4,该语句结束后p被指向a[1]
a5取到a[1]的值为2
f = --(*p);对p指向的值做前置--操作,即先将a[1]的值减1,再取a[1]的值,此时a[1] = 1。指针p本身并没有移动。
a6再次取a[1]的值,此时值为1(已在上面被修改)本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报