well 'a' and '&a' are definitely not the same
int a[10] takes up a specific block from memory to allocate exactly 10 integers and this block is called a.
'&a' refers to the memory address of this memory block of 10 integers you made.
it's like you have a hotel room (the array of 10 elements) in your hotel. And (your memory address) '&a' refers to your room number, your address.
now saying for example int *p = &a means I'm making an integer pointer 'p' that can only point to integers, and i'm giving it the memory address of 'a' (the array of integers) so it can point to it.
so :
int a[10] is your hotel room;
&a is your room number;
*p = &a is the key chain attached to your room number (ur keychain points to ur room number, your address);
this is why sometimes we use : int *da = new int[10];
to immediately allocate in memory a space for 10 integers and directly point a pointer (in this case da) to it.
Hope this helps.