No one answered all your questions.
strncpy() is used to copy data from a source to a dest of a set size, copying (padding) 0x00s if a 0x00 byte is found in the source array (string) before the end of the buffer. As opposed to strcpy which will blissfully copy forever until a 0 byte is found - even if said byte is well beyond your buffer.
memcpy() is used to copy from source to dest no matter what the source data contains. It also tends to be very hardware optimized and will often read system words (ints/longs) at a time to speed up copying when alignment allows.
memmove() is used to copy from an overlapping source and destination area (say moving an array's contents around within itself or something similiar - hence the move pnumonic.) It copies data starting at the back instead of the front to prevent data loss from the overlapping regions clobbering data before it can be read. It alos tends to be slightly less efficient as there usually isn't much hardware help copying data from back to front.
bcopy() and its relatives (bzero, and a few others) is a byte copy function I've seen now and then in embedded land. Usually, it copies data 1 byte at a time from source to dest to prevent misaligned memory address issues, though any good memcpy will handle this so its use is quite often suspect.
Good luck!