Различные способы доступа к элементам массива в 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