在C中访问数组元素的不同方式
我是C编程课程的助教,我遇到了以下C代码:
char str[] = "My cat's name is Wiggles."; printf("%c %c %c %c\n", str[5], *(str + 5), *(5 + str), 5[str]);
我之前从未遇到过最后一个论点( 5[str]
),我的教授也没有。 我不认为它在K&R和C Primer Plus中被提到过。 我在一组技术面试问题中找到了这段代码。 有谁知道为什么C允许你以这种方式访问数组元素? 我从未听说过括号集之外的索引以及括号内的数组名称。
对你的帮助表示感谢!
完全有效C.来自维基百科 :
类似地,由于表达式a [i]在语义上等价于*(a + i),而这相当于*(i + a),表达式也可以写成i [a](虽然这种forms很少用过的)。
古怪,但有效。
它基本上就是C的工作方式。 str[5]
与*(str + 5)
。 由于str + 5
和5 + str
是相同的,这意味着你也可以做*(5 + str)
或5[str]
。
如果您不将“5”视为索引,那么它会有所帮助,而只是C中的加法是可交换的 。
类似地,由于表达式a [i]在语义上等价于*(a + i),而这相当于*(i + a),表达式也可以写成i [a](虽然这种forms很少用过的)。
str[5]
直接转换为*(str + 5)
, 5[str]
直接转换为*(5 + str)
。 同样的事情=)
一切都一样。 * ptr或ptr [0]实际上意味着*(ptr + 0)。 所以每当你写* ptr或ptr [0]时,它都会变成*(ptr + 0)。 假设你想要ptr [4]的值,这意味着你也可以把它写成*(ptr + 4)。 现在无论你把它写成*(ptr + 4)还是*(4 + ptr),它都是一样的。 所以只是为了表明如果你可以写*(ptr + 4)作为ptr [4]同样的方式*(4 + ptr)与4 [ptr]相同。 请访问http://en.wikipedia.org/wiki/C_syntax#Accessing_elements了解更多详情。
如果str是char类型的数组,那么我们可以访问任何索引,如下所示 –
- STR [1]
- *(str + i)
- char * p = str,然后将索引i作为p [i]或*(p + i)访问
这肯定是一种时髦的语法,但……
str[5]
意味着*(str+5)
和
5[str]
意味着*(5+str)