今天在后台看到一个同学这样回复
里面有一个「具体解析在 嵌入式Linux 微信公众号」
原谅我 ,因为写的文章比较多了,我有时候都记不住自己写过哪些文章,所以我有时候为了找到自己的文章,也会使用到微信公众号的搜索功能,那个搜索的功能还是挺不错的,大家找问题也可以用这个方法。
图片有点不清晰,我把代码重新写一遍
int *p = &arg[1]
这行代码给这个题目定了一个基调,也就是这个基调让之后的所有操作都有据可依。
arg[1] 是int 的类型,&arg[1]的类型就是 int * ,所以它和int * p 的类型是匹配的。
*(p++) += 5
类似的题目可以看下面这篇文章
C 语言中,x += 5 == 4 是什么意思?
所以,*(p++) += 5 ,的操作就是,先把p指向的地址加上5,然后再执行p++跳转到下一个位置上去。
p 原来指向的位置是 arg[1],下一个位置自然就是arg[2]了。
那 v = *p 的值就很明显了,等于 arg[2]
*p = *p +5,也就是 arg[2] += 5,也就是arg[2] = 7。
至于题目里面说的arg[3],这个内存地址的值我认为不一定等于3的,p指针的操作也一直没有覆盖到这个地址,所以图片上的arg[3]的答案我认为不是正确的。
如果把题目修改成这样呢?
或者
考察点并不多,不过我相信依然有很多人写不出来的。
如果修改成这样
如果修改成这样的话,编译就会提示出问题,因为p的类型和arg的类型是不匹配的。
*p+++=5 ,操作会让arg[0] = 5,之后 p++ ,就直接跳到了数组的下一个元素。
这样之后,其他变量的大小应该没有问题了吧。
那如果是这样呢?
p 初始化的时候,就直接跳过了整个数组
*–p+=5 ,是让p退回来一个 int大小,然后再对指针操作,也就是arg[2] = 7。
之后,执行了一个 *p = *p +5,也就是arg[2] += 5。
具体答案就不说了