Since array references decay into pointers, if arr is an array, whats the difference between arr and &arr?
See question 6.12. comp.lang.c FAQ list · Question 11.24 Q: Why can’t I perform arithmetic on a void * pointer? A: The compiler doesn’t know the size of the pointed-to objects. (Remember that pointer arithmetic is always in terms of the pointed-to size; see also question 4.4.) Therefore, arithmetic on void *’s is disallowed (though some compilers allow it as an extension). Before performing arithmetic, convert the pointer either to char * or to the pointer type you’re trying to manipulate (but see also questions 4.5 and 16.7). References: ISO Sec. 6.1.2.5, Sec. 6.3.6 H&S Sec. 7.6.2 p. 204 comp.lang.c FAQ list · Question 11.25 Q: What’s the difference between memcpy and memmove? A: memmove offers guaranteed behavior if the memory regions pointed to by the source and destination arguments overlap. memcpy makes no such guarantee, and may therefore be more efficiently implementable. When in doubt, it’s safer to use memmove. It seems simple enough to implement memmove; the overlap guarantee