标题:c语言小白关于指针的问题
只看楼主
Wheat123
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2019-10-20
 问题点数:0 回复次数:10 
c语言小白关于指针的问题
*p++为什么是先取出变量在指向下一个地址
而不是先指向下一个地址,再取出下一个地址的变量
++的优先级不是高于*吗?
搜索更多相关主题的帖子: 变量 指针 地址 c语言 向下 
2019-10-20 13:13
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:620
专家分:3020
注 册:2011-4-22
得分:0 
个人理解:p++,是p运算以后再+1,这里的运算就是*p
2019-10-20 13:24
Wheat123
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2019-10-20
得分:0 
回复 2楼 zbjzbj
好像有点道理
2019-10-20 13:26
c小白2333
Rank: 5Rank: 5
来 自:中国
等 级:贵宾
威 望:11
帖 子:121
专家分:367
注 册:2019-6-17
得分:0 
C语言中是关于读取
如果连接在一起
是从左向右读取 连在一起读取
直到读取的字符不能作用则进行下个
如果可以作用则一起作用
如*q 可以作用而 *q+不能直接进行作用 则将*q 和+分开
接下来+和+可以连接在一起
则就进行了先取出变量在指向下一个地址
如a+++++b
则是 a ++ ++ +b
a先进行++再进行++在进行+b

宝剑锋从磨砺出,梅花香自苦寒来。
2019-10-20 20:27
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:0 
编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略有时被称为“贪心法”。
另一种表述是,输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2019-10-20 22:13
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
“*”和“++”这两个单目运算符,优先性是一样的,而且是从左到右的先后顺序。
先p++再*p,p++因为是“++”再后面,类似于副作用(整个式子结束后才生效);然后“*p”为p当前指向的地址的值。
连起来就是先取出指针p指向的地址的值,然后将p指向下一个地址。
如果用的话最好加个括号,做个提示。
2019-10-20 23:37
宁缺T
Rank: 1
等 级:新手上路
帖 子:21
专家分:8
注 册:2019-9-12
得分:0 
取值运算符的优先级比自加的要低。

Stay hungry,Stay foolish.
2019-10-23 07:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用Wheat123在2019-10-20 13:13:16的发言:

*p++为什么是先取出变量在指向下一个地址
而不是先指向下一个地址,再取出下一个地址的变量
++的优先级不是高于*吗?

++的优先级不是高于*吗?
------ 要说准确,后缀自增优先级 大于 解引用优先级,而 前缀自增优先级 等于 解引用优先级的。

*p++为什么是先取出变量在指向下一个地址
------ 这就是你老师失职的地方(我个人怀疑你是《谭C》的受害者),记住“优先级/结合性 与 求值顺序 无关”!

以 *p++ 为例:
根据运算符的优先级和结合性,编译器将它看作 *(p++)。
*(p++) 是个复合操作,子表达式是 p++,需要被评估,但其副作用未必需要先发生
补充一下,假如你看的是《谭C》,估计你连 p++ 是什么都不知道。p++ 是返回其自增之前的值,副作用是p的值自增1
因此 a = *(p++) 可以被编译器解析为:
TYPE temp = p; // 这是子表达式 p++ 的评估值
p = p + 1; // 这是子表达式 p++ 的副作用
a = *temp;
其中 副作用 只要发生在下一个序列点之前就行,因此 a = *(p++) 也可以被编译器解析为:
a = *temp;
p = p + 1;
但无论如何解析,p++ 的评估都发生在 *(p++) 之前,而p自增发生于*()之前还是之后则无所谓。
收到的鲜花
  • c小白23332019-10-23 20:42 送鲜花  5朵  
  • 外部三电铃2019-10-24 11:30 送鲜花  6朵   附言:支持版主大大
2019-10-23 09:09
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
嗯,麻烦版主一下,
后缀自增的优先级大于前缀自增
这个出处在哪,我得学习一下补补课。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2019-10-23 18:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 9楼 forever74
https://zh.
2019-10-24 08:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497357-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.194009 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved