Erm... both array and buf are the same type of variable, and since they're arrays, they're automatically cast to char* when you type the names, so the first strcpy is correct, and the second is not correct. But from what I understand, it's legal in C (which is just outright silly).
buf == char* and &buf == char**.
strcpy takes a char* and const char*.
This is just another stupid example.
1. array (buf)
2. &array (&buf)
3. &array (&buf)
array is not a function, it's an array - so array(buf) is not valid!
But even array[buf] is really stupid since it would most likely give an access violation (not to mention you're converting char* to int, which is legal in C, but really stupid).
Is the same as