The "array" itself is constant pointer, you can not address it to different location. Yes, array address is the same as &array[0], which is derived from &(array+0) and it is equal to &(array). We know that &* is eliminated so we are back to "array" again. So "array" is the same as "&*(array+0)"
But in regards to sizeof operator, the operand must be in array notation, not in pointer notation.
To clarify:
char *data = {"Today is Sunday"}; ... Pointer notation
char data[] = {"Today is Sunday"}; ... Array notation
In the first example with pointer notation the sizeof(data) will be the size of bytes required to store an address, which is 8 on my system. In the second example the sizeof(data) will give the number of bytes occupied by the array, which would be 15 chars in the string. But if you use pointer notation like sizeof(data+0) the result will be the number of bytes required to store an address, which is 8 on my system.
sizeof operator result is the same for pointer and for array with pointer notation.
sizeof(array)/sizeof(&array[0])
give you length == 20 – Dogcart