x is a pointer to an int and y is a pointer to an array of ints of unspecified size. It's equivalent to saying float x and then extern int x somewhere else. They're type mismatched.
If you said 'x is a char pointer', you mean lookup symbol table for address of x, then do a memory address dereference and then get the contents of the memory at dereferenced address.
If you said 'x is a char array', you mean use the symbol table to get the address, then calculate offset and get contents from that address.
When you define it one way and then do it another, you end up doing both of those above. get contents of x, then get value of offset, add it to the contents of x, then get contents of the resulting address+offset.
The issue is the declaration which can happen many times and the definition which occurs just once.
Now, you can have an array and a pointer be equivalent if it is used in an expression because the compiler converts array references to pointers.
Arrays and pointers are completely different entities in C. The only reason people think there's any sort of equivalence is because:
1. The "array indexing operator" [] actually works only on pointers.
2. Arrays are automatically converted to a pointer to the first array element whenever necessary.
3. Arrays are really uncommon in C, and many things we think of as arrays are not arrays as C considers them. Declare a function parameter with []? That's a pointer, not an array. Malloc a bunch of memory? Not an array.
If you said 'x is a char pointer', you mean lookup symbol table for address of x, then do a memory address dereference and then get the contents of the memory at dereferenced address.
If you said 'x is a char array', you mean use the symbol table to get the address, then calculate offset and get contents from that address.
When you define it one way and then do it another, you end up doing both of those above. get contents of x, then get value of offset, add it to the contents of x, then get contents of the resulting address+offset.
The issue is the declaration which can happen many times and the definition which occurs just once.
Now, you can have an array and a pointer be equivalent if it is used in an expression because the compiler converts array references to pointers.