The C standard defines the [] operator as follows:
a[b] == *(a + b)
Therefore a[5] will evaluate to:
*(a + 5)
and 5[a] will evaluate to:
*(5 + a)
The array's first element is indicated by the pointer a. Since we know from elementary school math that these are equal, a[5] is the value that is 5 more elements away from a. It is the same as *(a + 5).