C语言S1E22,测试题第二题的疑问。
如图,这里小甲鱼应该存在错误吧,问的是str能不能写成20,推导出来的是str == str。其实刚开始看到这个问题的时候脑袋里想着绝对不能,我以为问的是能不能将数组这样定义。没想到是printf输出的时候用,按照小甲鱼推导的确实可以接受,但是我没看答案之前上机测试 str 也可以正常编译运行且读取数据,然后我的世界观又崩塌了......
烦请各位大佬解答一下鄙人的疑惑,各位新人也可借此思考学习! Loser_YiMo 发表于 2022-7-10 12:11
对的,str会报错,是小甲鱼写错了,但是我该怎么理解20,20不能作为数组名,str的值要是作为下 ...
str = *(str + 20*元素尺寸) = *(20*元素尺寸 + str) = 20
数组下标访问法就是用指针实现的,你可以理解为不论是 str 还是 20,在间接访问之前,都对20进行过长度调整的 str 是非法的,没有这种表达式。20 好歹是 数组名[下标] 的表达式,所以才能计算。
你说能够正确编译并运行,那考虑是否编译器过于老旧,亦或是因为代码错误而自动运行上一次正确代码的结果等等因素。至少VS上是直接报语法错误的 风车呼呼呼 发表于 2022-7-10 12:07
str 是非法的,没有这种表达式。20 好歹是 数组名[下标] 的表达式,所以才能计算。
你说能够正确 ...
对的,str会报错,是小甲鱼写错了,但是我该怎么理解20,20不能作为数组名,str的值要是作为下标的话应该只有char能正常读取吧,如果是int那+1不就等于内存中+4嘛 本帖最后由 ba21 于 2022-7-10 12:32 编辑
这个问题 以前了解过。看你发的问题一下搞闷了。
str可以写成20 ,当然这不是一种标准写法。
20 相当于是*(20 + str)
str == *(str + 20) == *(20 + str) == str 而这里明显是书写错误。你可以发消息给老师进行更正。 ba21 发表于 2022-7-10 12:30
这个问题 以前了解过。看你发的问题一下搞闷了。
str可以写成20 ,当然这不是一种标准写法。
20 ...
编译器到底怎么解释str呀,我现在有点傻了。我认为他是先读取到str,数组的第一个元素的地址嘛,然后后面的20第二十一个元素嘛,所以要往后读取20个,所以是str+20,但是这里存在一个问题,就是如果我的数据类型是int,这里的+20在内存中应该是后20个int大小的对应地址。如果我变成20 + str,不会把str变成后str个某数据类型的地址嘛 风车呼呼呼 发表于 2022-7-10 12:46
str = *(str + 20*元素尺寸) = *(20*元素尺寸 + str) = 20
数组下标访问法就是用指针实现的, ...
哦哦,您的意思是编译器其实知道20这个玩意儿和str的区别,所以不管怎么写都会把20*元素尺寸对吧,我以为如果顺序反了会把str*元素尺寸呢
页:
[1]