int array[] = {3,4,5,2,9};
int *ptr1, *ptr2;
if we assign ptr1=array and ptr2=&array, the compiler will complain that
cannot convert from 'int (*)[5]' to 'int *' for ptr2=&array. That is because &array return pointer to array of integer of size 5. and array return pointer to integer.
We can experiment another statement as follows
printf("(&array+1) address= %d\n",(&array)); and
printf("(array+1) address= %d\n",(array));
Then the address difference between (&array+1) and (array+1) is 1310592-1310576=16 bytes since (&array+1) increase 20 bytes and (array+1) increase 4 bytes from the base address of the array.
On the other hand, if we have the statements as follows.
ptr1=array;
ptr2=(int*)&array;
printf("(&array) address= %d\n",ptr1);
printf("(array) address= %d\n",ptr2);
i.e. cast the type of &array into (int*), then above prints will be the same.