The BCPL infix “!” operator makes it a bit clearer, I think:
BCPL C
!a *a
a ! 0 a[0]
0 ! a 0[a]
!(a + 0) *(a + 0)
!(0 + a) *(0 + a)
That’s where C got its 0-based semantics from—it would be a nasty surprise if 0 weren’t the identity for pointer addition!