打印

*(P++) 与 *(++P)的区别

[复制链接]
1963|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
李进|  楼主 | 2012-9-13 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看书,有下面的问题::
书上说:
1、  *(P++)  是先取指针P的值,然后把地址加1
2、 *(++P)  是先把地址加1,然后取(P+1)的值

那我就想不明白了::不是说()是最高优先级的,先执行()内的,再执行其它的吗??????
那如果是照我这样子理解,不是两种都是先加1,再取值,都是第二种的情况吗????
实在不理解???????????????????????????????????????????????

相关帖子

沙发
我是土匪| | 2012-9-13 16:20 | 只看该作者
本帖最后由 我是土匪 于 2012-9-13 16:21 编辑

1、*(P++)  ,先执行括号的操作,由于++为后缀,因此先获取指针P指向的地址的数值,再将指针++,指向下一个地址;
2、*(++P) ,先执行括号的操作,即先将指针指向下一个地址,再取出其数值。

楼主遇到的问题不是指针不懂,而是没有理解 ++p和p++。

使用特权

评论回复
板凳
znmcu| | 2012-9-13 17:10 | 只看该作者
要看表达式的值

使用特权

评论回复
地板
diweo| | 2012-9-13 17:42 | 只看该作者
p++是先用再加1,++p是先加再用。
其实这里括号加不加应该都一样,因为++是右结合的。

使用特权

评论回复
5
李进|  楼主 | 2012-9-14 10:44 | 只看该作者
先谢上面三位的解或:

我是不是可以这样子理解::

p=1;
n=p++;
这样子的结果是: n=1;p=2;

p=1;
n=++p;
这样子的结果是: n=2;p=2;

使用特权

评论回复
6
diweo| | 2012-9-14 20:43 | 只看该作者
是的

使用特权

评论回复
7
原野之狼| | 2012-9-14 21:49 | 只看该作者
先谢上面三位的解或:

我是不是可以这样子理解::

p=1;
n=p++;
这样子的结果是: n=1;p=2;

p=1;
n=++p;
这样子的结果是: n=2;p=2;
李进 发表于 2012-9-14 10:44


那得看指针指向啥  要不然就不是加1哦~

使用特权

评论回复
8
zhuanghaiyang| | 2012-9-14 22:43 | 只看该作者
学习

使用特权

评论回复
9
李进|  楼主 | 2012-9-15 07:53 | 只看该作者
谢了,我明白了.....

使用特权

评论回复
10
amwrdfe| | 2012-9-15 12:44 | 只看该作者
指针的自加减是根据类型来递增递减,而不是简单的+1-1

使用特权

评论回复
11
lfjwfm| | 2012-9-15 17:11 | 只看该作者
新人其实如果不是为了考试,就不必去管这个东西。分两行就清楚了:
++p;
* P;

何必去管那么多,这样子写,查找错误都容易些。以前喜欢写一行,估计同先驱们打印纸贵有关系。那时候往往上机事件少,debug有时候会在纸上执行。

再说了,那时候是天才编程序。现在编程序基本上是一项office工作而已,呵呵。

使用特权

评论回复
12
lfjwfm| | 2012-9-15 17:13 | 只看该作者
编程能力体现在数学模型创建,以及对计算机能力的感悟上面。当写程序时,把自己当做计算机就对了。

至于这些雕虫小技,不值得纠缠。

使用特权

评论回复
13
kseeker| | 2012-9-16 08:34 | 只看该作者
这个问题还真不是LS说的“雕虫小技”。
*(P++) 是C里面非常常见的一种写法,而相反,*(++P)却几乎用不到。
实际上,*(P++)是如此重要, 几乎可以被当成 +=, -= 一样的单独运算。这是一种高级一些的“数学模型”,就像STL里的for_each之类的算法一样,它们代表一种常见的模式。熟练运用这些模式,不但可以提高工作效率,并且减少错误,而不是增加错误。

使用特权

评论回复
14
李进|  楼主 | 2012-9-16 09:26 | 只看该作者
新人其实如果不是为了考试,就不必去管这个东西。分两行就清楚了:
++p;
* P;

何必去管那么多,这样子写,查找错误都容易些。以前喜欢写一行,估计同先驱们打印纸贵有关系。那时候往往上机事件少,debug有时候会在纸上执行。

再说了,那时候是天才编程序。现在编程序基本上是一项office工作而已,呵呵。
??????????????????????????????????????????????????????????????????????????????

这位大哥想法我非常赞同,平时,我都是按下面的方法去搞的:
A = *P;
P++;
但我老在书本和网上资料中看到A=*P++; 平时不理解,只有死记硬背把原理记下来了,现在又出现了
个A=*(++P),我晕倒了....................

使用特权

评论回复
15
followme001| | 2012-9-17 14:54 | 只看该作者
*(P++),分三步:1。先取指针P的值(地址)的一份拷贝 2。然后P自增一 3。最后取拷贝的内容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

321

帖子

1

粉丝