C语言指针问题

如图,请问为什么会有这样的输出结果?... 如图,请问为什么会有这样的输出结果? 展开
 我来答
CodeBlove
2021-08-22 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:245万
展开全部
1、ptr赋值为arr地址后指向第一个元素,即元素6.
2、*(ptr++) += 123;由于是右侧操作(递增后缀),所以先取ptr地址后再递增ptr,此时取得的地址还是第一个元素地址(递增后ptr指向第二个元素,也就是7,这是第一次递增),因此是对6+123=129,并保存原地址,即第一个元素地址,因此6被改为129。
3、输出时,由于printf为了左对齐参数格式,必须从右到左处理参数入栈,由于++ptr为左侧操作,因此先递增ptr,ptr指向第三个元素,这是第二次递增,然后取值,那么显然读取的数据为8、入栈,然后再处理左侧参数*ptr,此时ptr没有递增还是指向8,因此取得的还是8,入栈。因此输出都是8

PS:进入函数后,先退栈取值得到第一个参数,也就是后入栈的函数左侧参数,输出,再退栈取得第二个参数,也就是先入栈的函数右侧参数,输出。

这类前后++--的题实际很简单,先搞清楚优先级就行了,也就是搞清楚执行先后,左侧++--优先级最高,比如 a*++b--这样的表达式,不用看肯定是++优先,先处理++b再与a相乘,还比如a+++b,表达式解析时是从左到右,所以先判断为a的右侧操作,所以先取值后递增,取值后再与b相加。
其二,递增递减操作在变量左侧的会立刻影响当前取值,因为它是先运算再取值,而在右侧操作的会影响后续代码的变量取值,但不改变当前对变量的取值,因为在递增递减前当前取值已经完成。
听不清啊
高粉答主

2021-12-21 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部
这个图中的第378行语句,在不同的编译系统中,可能会有不同的解释。所以一般在容易引起歧义的情况下,最好不要采用这种写法,在这里,他是先进行后面的自加操作的结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2021-08-22 · TA获得超过1.8万个赞
知道大有可为答主
回答量:2.4万
采纳率:18%
帮助的人:762万
展开全部
专题讲解C语言指针,帮助你在短时间内掌握指针的各种玩法。指针是C语言的难点,也是C语言的重点,玩不转指针,学习C语言就没有意义。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式