展开全部
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相加。
其二,递增递减操作在变量左侧的会立刻影响当前取值,因为它是先运算再取值,而在右侧操作的会影响后续代码的变量取值,但不改变当前对变量的取值,因为在递增递减前当前取值已经完成。
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相加。
其二,递增递减操作在变量左侧的会立刻影响当前取值,因为它是先运算再取值,而在右侧操作的会影响后续代码的变量取值,但不改变当前对变量的取值,因为在递增递减前当前取值已经完成。
展开全部
这个图中的第378行语句,在不同的编译系统中,可能会有不同的解释。所以一般在容易引起歧义的情况下,最好不要采用这种写法,在这里,他是先进行后面的自加操作的结果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
专题讲解C语言指针,帮助你在短时间内掌握指针的各种玩法。指针是C语言的难点,也是C语言的重点,玩不转指针,学习C语言就没有意义。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询