Почему `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*, мы можем написать более короткий код, и приведение не имеет снижения производительности.

Другие вопросы по тегам