*p++=i怎么理解?

#include<stdio.h>
void fibonacci(int *p,int n)
{
 *p++=1;
 *p++=1;
 while(n>2)
 {
  *p++=*(p-1)+*(p-2);
   n--;
 }
}
void main()
{
 int i,f[20];
 fibonacci(f,20);
 for(i=0;i<=19;i++)
  printf("%d
",f[i]);
}

求大佬帮我解释下这段代码, 中间的*p++=1是什么意思????_慕课猿问  https://www.imooc.com/wenda/detail/351407?t=246589

5 回答

已采纳
?
望远

*p++有运算符运算顺序的问题,首先*和++运算符同级,但是结合性是从右往左,先执行p++后执行*

所以*p++=1即:

指针p指向的地址先自增1(此时指针p还是指向原地址空间),然后它指向的地址空间赋值为1,完成这一操作后指针指向下一个地址。

 反对 回复2017-06-08
  • 安之4183388
    安之4183388
    同等级的运算符运算顺序是从右到左么????
  • onemoo
    onemoo
    同级运算符的运算顺序不一定是从右到左的,具体是什么顺序应该参考运算符优先级和结合性表。
?
onemoo

你采纳的那个答案有些问题。

其实 后置自增运算符 p++ 的优先级是高于 解引用运算符 * 的。在他给的那个图里,后置自增运算符应该分类第一优先级中。

这样的话,似乎解释上没有太大差别,不过其实自增运算解释起来还是有些复杂的:

1. 也是 ++ 先运算:得到的相当于是 p 指针。

2. 然后再算解引用运算符:得到上一步获得的指针所指的对象(也就是 p 开始时所指的对象)。

3. 最后算赋值运算符:将 1 赋值给上一步得到的那个 p 所指的对象。

并且因为自增运算符还会使 p 自增,所以 p 在语句结束后肯定自增了,也就是会指向后面的一个对象。

注意上一句我说的是“p 在语句结束后肯定自增了”,我并没有说“p在语句结束后才自增”之类的话,也就是说 p 具体是在哪个时点自增的是无法确定的。对这个语句而言,能确定的仅仅是 p 在语句结束后肯定已经自增过了。

也许你会说,既然不确定 p 是何时自增的,也许 p 在第 2 步之前就自增了,那么第 2 步解引用的也可能是自增后的 p 了吗?

确实 p 自增时机不确定,也可能会在第 2 步前自增。但这和第 2 步解引用运算没有关系——因为解引用的根本就不是 p 指针!

我在第 1 步的描述中说的是“相当于是 p 指针”,没有说“得到的是 p 指针”。因为 p++ 运算符得到的其实是当时 p 的值,并不是得到 p 指针本身。 或者说你可以认为 p++ 得到的是一个临时指针,只不过该指针和 p 相等而已。所以后续 p 是否自增什么的跟后面的运算没有关系。

C 语言中有的运算符得到的是“对象的值”,有的运算符得到的是“对象本身”,请好好揣摩下这两种说法的区别。比如第 2 步的解引用运算符,它得到的就是指针所指的对象本身,所以那一步中该对象会被赋值为 1。

所以你采纳的那个答案中“此时指针p还是指向原地址空间”这句话其实也说错了! 事实上并不能确定那时 p 是否已经自增过了。

你这个代码还有一个大问题:

*p++=*(p-1)+*(p-2);  这语句的行为是未定义的!

道理和上面说的一样,因为等号左边有 p++ 表达式,这会使 p 自增,可是自增时机是不确定的,p 可能会在这语句执行中的任何一个步骤时自增,所以等号右侧那些 p-1  p+2 在计算时 p 的值是多少也是不确定的。那么整个表达式的结果就是未定义的!

 反对 回复2017-06-09
 
?
灬elliott

p是地址,*p是这个地址指向的整数,   意思就是把  *p+1之后的值赋值给*p

 反对 回复2017-06-08
 
?
望远

//img.mukewang.com/593956120001789c06060592.jpg

看一下这个C语言运算符优先级表

 反对 回复2017-06-08
  • onemoo
    onemoo
    怪不得之前提到这个问题时你的理解就有错误呢。原来是你参考的这个表格错了! 后置自增/减运算符应该是属于第 1 优先级的。
?
慕粉1146083187

指针p指向的地址先加1,然后它指向的值赋值为1,完成这一操作后指针指向改变,指向下一个地址。

  

原文地址:https://www.cnblogs.com/tongongV/p/10990590.html