baidu_35264554 2016-06-16 06:35 采纳率: 50%
浏览 955
已采纳

求教大神 关于指针移动问题 谢谢

#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

  • 写回答

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(已在上面被修改)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作