La definición de la función memmove de la biblioteca c es como la siguiente:
void* memmove(void *s1, const void *s2, size_t n) { char *sc1; const char *sc2; sc1 = s1; sc2 = s2; ... } Me pregunto por qué necesitamos usar void* y const void* como tipo de parámetros. ¿Por qué no directamente char* y const char* ?
int test_case[] = {1, 2, 3, 4, 5, 6, 7, 8, 10}; memmove(test_case+4, test_case+2, sizeof(int)*4);Salida: test_case = {1, 2, 3, 4, 3, 4, 5, 6, 10}
Si se usan char* y const char* , siempre tenemos que convertir a char* al invocar memmove en otros tipos.
Al usar void* y const void* , podemos escribir código más corto y la conversión no tiene sobrecarga de rendimiento.
void * es el tipo de puntero genérico. Se supone que memmove manipula la memoria independientemente del tipo de objetos que haya en la memoria.
Del mismo modo para memcpy . Compárelo con strcpy que usa parámetros char * porque se supone que manipula cadenas.