&arr yields a pointer, of type pointer-to-array-of-T, to the entire array.
A simple reference (without an explicit &) to an array yields a pointer, of type pointer-to-T, to the array's first element.
Most important thing to remember is the type.
So for example the array is
Code:
int array[3]={1,2,3}
if you say
Code:
array or &array[0] gives the address and the type int but if you say &array it gives address but the type is int [3], 3 being the size of array.
Hence if
Code:
int array[3]={1,2,3};
int *p;
p = array; // p is pointing to array first element
int (*q)[3] // q is pointing to int array of 3
q = &array;
if you increment p then it will increment to one element of int or it points to the next element of array that is 2 here
but if you increment q it will increment beyond the entire array.
I am not sure if i am clear. If any mistakes in my explanation please correct me.