Согласно стандарту C (6.5.2.1 Массив подписки)
2 Постфиксное выражение, за которым следует выражение в квадратных скобках []
является подписанным обозначением элемента объекта массива.
Определение индекса оператора [] заключается в том, что E1 [E2] идентичен
к (* ((E1) + (E2))). Из-за правил преобразования, которые применяются к
бинарный оператор +, если E1 является объектом массива (эквивалентно, указатель на
начальный элемент объекта массива) и E2 является целым числом, E1 [E2]
обозначает E2-й элемент E1 (считая с нуля).
Таким образом, s[i]
эквивалентно *( s + i )
, что с математической точки зрения эквивалентно *( i + s )
и в C может быть переписано как i[s]
, потому что в любом случае выражение считается как *( i + s )
.
Таким образом, все эти конструкции
s[ i ]
*(s+i)
*(i+s)
i[s]
эквивалентны в C и обозначают i-th
элемент массива s
.
Что касается вашего комментария к моему ответу
Не могли бы вы объяснить, как цикл for становится истинным во время
начальная итерация?
затем массив s
инициализируется строковым литералом "d"
.
char s[ ] = "d";
Строковый литерал включает в себя завершающий нулевой символ '\0'
. Таким образом, приведенная выше декларация может быть эквивалентно переписана следующим образом:
char s[ ] = { 'd', '\0' };
Поскольку первый элемент массива не равен нулю (он равен символу 'd'
), то условие s[i]
, эквивалентное условию s[i] != 0
, истинно, когда i
равно 0
.
И цитата относительно оператора for (6.8.5 Итерационные операторы)
4 Итерационный оператор вызывает оператор, называемый телом цикла,
повторяться до тех пор, пока управляющее выражение не сравнится
до 0 . Повторение происходит независимо от того, является ли тело цикла
вводится из оператора итерации или с помощью прыжка.1