Вы действительно должны использовать ptr[i]
над *(ptr + i)
для удобства чтения.Но кроме этого, оператор []
, строго говоря, фактически никогда не используется с операндом массива.
Массивы, когда используются в выражении, всегда "распадаются" в указатель на первый элемент (снекоторые исключения).C17 6.3.2.1/3, выделено:
За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или строковый литерал, используемый для инициализации массива, выражение с типом '' массив типа '' преобразуется в выражение с типом '' указатель на тип '', которое указывает на начальный элемент объекта массива и не является lvalue.
Это означает, что всякий раз, когда вы вводите arr[i]
, операнд arr
заменяется указателем на первый элемент в этом массиве.Это неофициально называется «распадом массива».Больше информации здесь: Что такое распадающийся массив?
Поэтому, когда вы используете оператор []
, вы используете его для указателя.Всегда.
Стандарт C говорит, что этот оператор гарантированно эквивалентен арифметике указателя (C17 6.5.2.1/2):
Определение оператора индекса []
:что E1[E2]
идентично (*((E1)+(E2)))
.
Так что всякий раз, когда мы набираем arr[i]
, он фактически заменяется на *(arr+i)
.Где arr
по-прежнему является указателем на первый элемент.
И вот почему приведенное вами описание говорит вам, что операнд либо может быть указателем, а другой - целым числом.Потому что, очевидно, не имеет значения, если мы введем *(arr+i)
или *(i+arr)
- это эквивалентный код.
Что, в свою очередь, позволяет нам написать запутанный код "шутки", такой как i[arr]
, который на самом деле является допустимым C и полностью эквивалентен arr[i]
.Но не пишите такой код в реальных приложениях.