C笔试O_o我都不记得有这个图片_数据结构


今天在后台看到一个同学这样回复

C笔试O_o我都不记得有这个图片_数据结构_02

里面有一个「具体解析在 嵌入式Linux 微信公众号」

原谅我 ,因为写的文章比较多了,我有时候都记不住自己写过哪些文章,所以我有时候为了找到自己的文章,也会使用到微信公众号的搜索功能,那个搜索的功能还是挺不错的,大家找问题也可以用这个方法。

图片有点不清晰,我把代码重新写一遍

C笔试O_o我都不记得有这个图片_数据结构_03

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]的答案我认为不是正确的。


如果把题目修改成这样呢?

C笔试O_o我都不记得有这个图片_c++_04

或者

C笔试O_o我都不记得有这个图片_c++_05

考察点并不多,不过我相信依然有很多人写不出来的。

如果修改成这样

C笔试O_o我都不记得有这个图片_数据结构_06

如果修改成这样的话,编译就会提示出问题,因为p的类型和arg的类型是不匹配的。

C笔试O_o我都不记得有这个图片_java_07

*p+++=5 ,操作会让arg[0] = 5,之后 p++ ,就直接跳到了数组的下一个元素。

这样之后,其他变量的大小应该没有问题了吧。


那如果是这样呢?

C笔试O_o我都不记得有这个图片_算法_08

p 初始化的时候,就直接跳过了整个数组

*--p+=5 ,是让p退回来一个 int大小,然后再对指针操作,也就是arg[2] = 7。

之后,执行了一个 *p = *p +5,也就是arg[2] += 5。

具体答案就不说了