猿问

求大佬帮我解释下这段代码, 中间的*p++=1是什么意思????

#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\n",f[i]);
}

安之4183388
浏览 3555回答 4
4回答

望远

*p++有运算符运算顺序的问题,首先*和++运算符同级,但是结合性是从右往左,先执行p++后执行*所以*p++=1即:指针p指向的地址先自增1(此时指针p还是指向原地址空间),然后它指向的地址空间赋值为1,完成这一操作后指针指向下一个地址。

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 的值是多少也是不确定的。那么整个表达式的结果就是未定义的!

灬elliott

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

慕粉1146083187

指针p指向的地址先加1,然后它指向的值赋值为1,完成这一操作后指针指向改变,指向下一个地址。
随时随地看视频慕课网APP
我要回答