Различные способы доступа к элементам массива в C

Я преподаватель для курса программирования C, и я наткнулся на следующую строку кода C:

char str[] = "My cat 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 позволяет вам также получить доступ к элементу массива? Я никогда не слышал, чтобы индекс находился за пределами набора скобок и имя массива внутри скобок.

Ваша помощь будет принята с благодарностью!

Ответ 1

Совершенно действительный C. Из Wikipedia:

Аналогично, поскольку выражение a [i] семантически эквивалентно * (a + i), которое, в свою очередь, эквивалентно * (i + a), выражение также может быть записано как я [a] (хотя это форма редко используется).

Неаккуратный, но действительный.

Ответ 2

Это в основном просто способ работы C. str[5] действительно эквивалентен *(str + 5). Поскольку str + 5 и 5 + str совпадают, это означает, что вы также можете сделать *(5 + str) или 5[str].

Это помогает, если вы не думаете о "5" как о индексе, а скорее о том, что добавление в C коммутативное.

Ответ 3

str[5] непосредственно переводит на *(str + 5), а 5[str] прямо переводит на *(5 + str). То же самое =)

Ответ 4

Аналогично, поскольку выражение a [i] семантически эквивалентно * (a + i), которое, в свою очередь, эквивалентно * (i + a), выражение также может быть записано как я [a] (хотя это форма редко используется).

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

Ответ 5

Все это. * 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 для более подробной информации.

Ответ 6

если str является массивом типа char, тогда мы можем получить доступ к любому индексу say i, как показано ниже -

  • ул [I]
  • * (str + i)
  • char * p = str, затем обращайтесь к индексу я как p [i] или * (p + i)

Ответ 7

Это фанковый синтаксис, но...

str[5] означает *(str+5)

и

5[str] будет означать *(5+str)

Ответ 8

Пример кода.

#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