A postfix expression followed by an expression in square brackets is a
postfix expression

. One of the expressions shall be a glvalue of type “array of

T” or a prvalue of type “pointer
to

T” and the other shall be a prvalue of unscoped enumeration or integral type

. The result is of type “

T”

. The type “

T” shall be a completely-defined object type

.
The expression

E1[E2] is identical (by definition) to

*((E1)+(E2))
, except that in the case of an array operand, the result is an lvalue
if that operand is an lvalue and an xvalue otherwise

. The expression

E1 is sequenced before the expression

E2.