鱼C论坛

 找回密码
 立即注册
查看: 1801|回复: 6

[已解决]C语言S1E22,测试题第二题的疑问。

[复制链接]
发表于 2022-7-10 11:42:44 | 显示全部楼层 |阅读模式
10鱼币
如图,这里小甲鱼应该存在错误吧,问的是str[20]能不能写成20[str],推导出来的是str[20] == [20]str。
其实刚开始看到这个问题的时候脑袋里想着绝对不能,我以为问的是能不能将数组这样定义。没想到是printf输出的时候用,按照小甲鱼推导的确实可以接受,但是我没看答案之前上机测试 [20]str 也可以正常编译运行且读取数据,然后我的世界观又崩塌了......

烦请各位大佬解答一下鄙人的疑惑,各位新人也可借此思考学习!
最佳答案
2022-7-10 11:42:45
Loser_YiMo 发表于 2022-7-10 12:11
对的,[20]str会报错,是小甲鱼写错了,但是我该怎么理解20[str],20不能作为数组名,str的值要是作为下 ...

str[20] = *(str + 20*元素尺寸) = *(20*元素尺寸 + str) = 20[str]
数组下标访问法就是用指针实现的,你可以理解为不论是 str[20] 还是 20[str],在间接访问之前,都对20进行过长度调整的
QQ截图20220710113436.png

最佳答案

查看完整内容

str[20] = *(str + 20*元素尺寸) = *(20*元素尺寸 + str) = 20[str] 数组下标访问法就是用指针实现的,你可以理解为不论是 str[20] 还是 20[str],在间接访问之前,都对20进行过长度调整的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-10 11:42:45 | 显示全部楼层    本楼为最佳答案   
Loser_YiMo 发表于 2022-7-10 12:11
对的,[20]str会报错,是小甲鱼写错了,但是我该怎么理解20[str],20不能作为数组名,str的值要是作为下 ...

str[20] = *(str + 20*元素尺寸) = *(20*元素尺寸 + str) = 20[str]
数组下标访问法就是用指针实现的,你可以理解为不论是 str[20] 还是 20[str],在间接访问之前,都对20进行过长度调整的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-10 12:07:58 | 显示全部楼层
[20]str 是非法的,没有这种表达式。20[str] 好歹是 数组名[下标] 的表达式,所以才能计算。
你说能够正确编译并运行,那考虑是否编译器过于老旧,亦或是因为代码错误而自动运行上一次正确代码的结果等等因素。至少VS上是直接报语法错误的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-10 12:11:59 | 显示全部楼层
风车呼呼呼 发表于 2022-7-10 12:07
[20]str 是非法的,没有这种表达式。20[str] 好歹是 数组名[下标] 的表达式,所以才能计算。
你说能够正确 ...

对的,[20]str会报错,是小甲鱼写错了,但是我该怎么理解20[str],20不能作为数组名,str的值要是作为下标的话应该只有char能正常读取吧,如果是int那+1不就等于内存中+4嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-10 12:30:52 | 显示全部楼层
本帖最后由 ba21 于 2022-7-10 12:32 编辑

这个问题 以前了解过。看你发的问题一下搞闷了。
str[20]可以写成20[str] ,当然这不是一种标准写法。
20[str] 相当于是  *(20 + str)

str[20] == *(str + 20) == *(20 + str) == [20]str 而这里明显是书写错误。你可以发消息给老师进行更正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-10 12:50:19 | 显示全部楼层
ba21 发表于 2022-7-10 12:30
这个问题 以前了解过。看你发的问题一下搞闷了。
str[20]可以写成20[str] ,当然这不是一种标准写法。
20 ...

编译器到底怎么解释str[20]呀,我现在有点傻了。我认为他是先读取到str,数组的第一个元素的地址嘛,然后后面的20第二十一个元素嘛,所以要往后读取20个,所以是str+20,但是这里存在一个问题,就是如果我的数据类型是int,这里的+20在内存中应该是后20个int大小的对应地址。如果我变成20 + str,不会把str变成后str个某数据类型的地址嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-10 12:54:06 | 显示全部楼层
风车呼呼呼 发表于 2022-7-10 12:46
str[20] = *(str + 20*元素尺寸) = *(20*元素尺寸 + str) = 20[str]
数组下标访问法就是用指针实现的, ...

哦哦,您的意思是编译器其实知道20这个玩意儿和str的区别,所以不管怎么写都会把20*元素尺寸对吧,我以为如果顺序反了会把str*元素尺寸呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表