Some basic stuff:
Your array is stored in memory, every cell has its own address. The name of your array a
points to the place in memory where it starts. From there a[0]
, a[1]
or just a[index]
is the same thing as you'd type*(a+index)
- it gets/sets value placed under (a+index) index in a memory.
In fact you can overwrite any of these addresses even if they aren't being used by your variables (arrays etc.). Of course you shouldnt do this, but your compilator won't be mad (you can also declare variable-length arrays, compilator might not care, but you should be aware of that).
I tried to make it as simple as possible, there is no need to elaborate, I believe.