Pointer arithmetic and the dereferencing operator make it possible to use subscripts on pointers just as with arrays.
For example, with the declarations below, p has value &a[0] and
*p is the same as a[0]
*(p +1) is the same as a[1]
*(p + 2) is the same as a[2]
...

Actually C++ interprets subscripts for ordinary arrays using pointer arithmetic and the dereferencing operator
a[0] is just *a
a[1] is just *(a + 1)
a[2] is just *(a + 2)
...
So it is also allowed to use subscripts on pointers and
p[0] is just *p
p[1] is just *(p + 1)
p[2] is just *(p + 2)
...