было бы хорошо, если бы функция была: void memcpy(char* dst, const char* src, size_t size)
?Почему memcpy использует указатель void как параметр?
В чем преимущество использования указателей void в memcpy()?
было бы хорошо, если бы функция была: void memcpy(char* dst, const char* src, size_t size)
?Почему memcpy использует указатель void как параметр?
В чем преимущество использования указателей void в memcpy()?
До типа void
данных был добавлен в стандарте 1989, что был как функции, такие как memcpy
были разработаны. char *
был самым близким к «универсальному» указателю в то время.
Проблема заключается в том, что если memcpy
до сих пор используются char *
аргументы и вы хотели назвать memcpy
на цель, которая не является массивом char
, вы должны явно привести значение указателя:
int foo[N];
int bar[N];
...
memcpy((char *) foo, (const char *) bar, N * sizeof *foo);
потому что вы не можете назначать указатели одного типа другому типу без броска. Это не было (как большая часть) проблемой в pre-ANSI C, потому что у вас не было прототипов функций; то есть компилятор не проверял, что количество и типы аргументов в вызове функции соответствуют определению, но это определенно проблема.
Однако, в отличие от других типов указателей объекта, вы можете присвоить любое T *
значения void *
и обратно без необходимости броска, поэтому memcpy
вызова может быть записан в виде
memcpy(foo, bar, N * sizeof *foo);
Я помню дни до стандартизации (хотя я все еще был в колледже). Кастинг гимнастики не был забавным. Объявите тип void *
, потому что он спасет вас от изжоги.
было бы хорошо, если бы функция была: void memcpy (char * dst, const char * src, size_t size)?
Да, поскольку указатели могут быть переведены в другой тип указателя.
В чем преимущество использования указателя void в memcpy()?
Избегайте приведения к типу указателя адресата.
В чем преимущество использования указателя
void
вmemcpy()
?
Указатель void является общим указателем, поэтому он может принимать указатель на любой тип.
Да, вы можете. Это указатель на пустоту как уведомление, что вы можете передать любой указатель на него. Вам не нужно посылать char * или int *, вы можете отправить MyNewStruct *, и он будет копировать память одинаково. Но в любом случае, это то, что вы можете посмотреть буквально за 3 секунды. Боюсь, довольно бесполезный вопрос. – BrainSteel
'void * memcpy()' return destination ... как вы получите данные с помощью 'void memcpy() '? – someone
Данные @ Кришна готовы в * dst. Возвращение указателя на dst является обычным для цепочки вызовов функций, для меня это необязательно. – Deqing