在C中访问数组元素的不同方式

时间:2011-04-05 01:09:55

标签: c arrays

我是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允许你以这种方式访问​​数组元素?我从来没有听说过括号集之外的索引和括号内的数组名称。

非常感谢您的帮助!

8 个答案:

答案 0 :(得分:8)

答案 1 :(得分:3)

这基本上只是C的工作方式。 str[5]*(str + 5)非常相同。由于str + 55 + str相同,这意味着您还可以*(5 + str)5[str]

如果您不将“5”视为索引,那么它会有所帮助,而只是C中的添加是commutative

答案 2 :(得分:3)

str[5]直接翻译为*(str + 5)5[str]直接翻译为*(5 + str)。同样的事情=)

答案 3 :(得分:2)

  

类似地,由于表达式a [i]在语义上等价于*(a + i),而这相当于*(i + a),表达式也可以写为i [a](尽管这形式很少使用。)

http://en.wikipedia.org/wiki/C_syntax#Accessing_elements

答案 4 :(得分:2)

一切都一样。 * 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

答案 5 :(得分:2)

如果str是char类型的数组,那么我们可以访问任何索引,如下所示 -

  1. STR [1]
  2. *(str + i)
  3. char * p = str,然后将索引i作为p [i]或*(p + i)
  4. 访问

答案 6 :(得分:1)

这肯定是一种时髦的语法,但是......

str[5]意味着*(str+5)

5[str]意味着*(5+str)

答案 7 :(得分:0)

示例代码。

#include<stdio.h>
int main(){
    int arr[] = {1, 2, 3};
    for(int i = 0; i <= 2; i++){
        printf("%d\t", i[arr]);
    }
    return 0;
}

输出:1 2 3