Почему `memmove` использует`void *`в качестве параметра вместо`char *`?
Определение функции библиотеки c memmove
это как следующее:
void* memmove(void *s1, const void *s2, size_t n)
{
char *sc1;
const char *sc2;
sc1 = s1;
sc2 = s2;
...
}
Мне интересно, почему мы должны использовать void*
а также const void*
как тип параметров. Почему не напрямую char*
а также const char*
?
Обновить
int test_case[] = {1, 2, 3, 4, 5, 6, 7, 8, 10};
memmove(test_case+4, test_case+2, sizeof(int)*4);
Вывод: test_case = {1, 2, 3, 4, 3, 4, 5, 6, 10}
2 ответа
Решение
void *
типовой указатель memmove
Предполагается манипулировать памятью независимо от того, какие объекты находятся в памяти.
Аналогично для memcpy
, Сравните это с strcpy
который использует char *
параметры, потому что он должен манипулировать строками.
Если char*
а также const char*
используются, то мы должны всегда приводить char*
при вызове memmove
на других типах.
Используя void*
а также const void*
, мы можем написать более короткий код, и приведение не имеет снижения производительности.