您当前的位置: 首页 > 

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

发布时间:2022-10-07 09:38:10 ,浏览量:0

2edb5ecb552b1a604a7c51809f0b89a2.jpeg

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

30d4f2977ffccf0ce1c9f64c42ff00fc.png

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

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

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

2446e2bbda7baec0b265ae62189d86d1.png

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

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

27d6fbd6a5b128e3232f6f3720a8be8a.png

或者

b9b1cee2a753b18952375c62f38d584d.png

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

如果修改成这样

5a30971fc048220998bb2b384d10eaa0.png

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

90d39ab98831938aac20bbbb5f418d67.png

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

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

那如果是这样呢?

172dfb35eca3071c04eaf0506623b814.png

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

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

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

具体答案就不说了

f603fa1897766f7eaa262fdfc8b686f8.jpeg

88b72825f6c37251ee126a9b0bd58da0.gif

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    109966博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.2801s