#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]);
}

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

5 回答

已采纳

望远

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

所以*p++=1即:

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

 反对 回复2017-06-08
  • 安之4183388

    同等级的运算符运算顺序是从右到左么????
    回复举报2017-06-08
  • onemoo

    同级运算符的运算顺序不一定是从右到左的,具体是什么顺序应该参考运算符优先级和结合性表。
    回复举报2017-06-09

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
 

望远

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

 反对 回复2017-06-08
  • onemoo

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

慕粉1146083187

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

  

*p++=i怎么理解?的更多相关文章

  1. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  2. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  3. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  6. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  7. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

  8. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  9. 深入理解JS 执行细节

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...

  10. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

随机推荐

  1. k8s之dashboard认证、资源需求、资源限制及HeapSter

    1.部署dashboard kubernetes-dashboard运行时需要有sa账号提供权限 Dashboard官方地址:https://github.com/kubernetes/dashboa ...

  2. Java生成随机数列表

    生成随机数列表 1.Java8以前 (1)Math.random private List<UserEntity> random1() { ArrayList<UserEntity& ...

  3. Java浅拷贝与深拷贝(思维导图)

    图1 拷贝思维导图(点击查看图片) 1,拷贝 有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号! 相同可能表示这么几个意思:① ...

  4. StoneTab标签页CAD插件 3.2.6

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  5. python计算出现错误

    用python计算39.8-0.1得出的结果是39.699999999999996 其他数字计算正确,唯独这个计算错误. 原因: 中文解释: https://docs.python.org/zh-cn ...

  6. 【php设计模式】适配器模式

    适配器模式(对象适配器.类适配器): 将一个类的接口转换成客户希望的另一个接口.适配器模式让那些接口不兼容的类可以一起工作. 在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的 ...

  7. Maven错误:警告Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published

    该错误是在我将一个普通的由maven管理的java项目变为javaweb项目后出现的,由警告可以看出是说maven的类路径容器不会被导出或发布(即通过maven管理的依赖不会被导出或发布),那么我们用 ...

  8. window上mongoDB的安装及常用mongodb命令

    前几天在学习node操作数据库时使用的mongoDB数据库,今天来对mongodb的安装过程及配置以及后面需要使用的一些常用命令做一下总结. 安装MongoDB (可参考菜鸟教程中的安装步骤) 首先, ...

  9. js对象中属性调用.和[] 两种方式的区别

    JS 调用属性一般有两种方法——点和中括号的方法. 标准格式是对象.属性(不带双引号),注意一点的是:js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等 ...

  10. 通过hadoop上的hive完成WordCount

    1.启动hadoop 打开所有命令:start-all.sh 2.Hdfs上创建文件夹 创建名为PGOne到user/hadoop 3.上传文件至hdfs 创建和修改508.txt文件,里面尽量多写一 ...