Well for a quick sum up:
An array is like a constant pointer, it's always pointing at the first element of the the array. To try to point it at something else is an error.
array[2]
is short for *(array + 2*sizeof(<type of array>))
which takes the address of the first element and adds the appropriate number of bytes to it in order to access the requested element, then it dereferences the "pointer" and you get the value of the element.If this isn't 100% correct, please let me know.