Говоря функционально и синтаксически, есть ли разница между функцией, прототип которой int foo(void)
и int foo(void *)
?
Я знаю разницу между, например, int bar(int)
и int bar(int *)
- один из них ищет int, а другой ищет указатель int. Ведет ли void
себя так же?
c++
c
function-prototypes
Ник Рид
источник
источник
foo(void)
иfoo()
.Ответы:
С этого ответа на Software Engineering,
void
рассматривается специально в зависимости от того, как он используется. ВC
иC++
,void
используется для указания на отсутствие типа данных, в то времяvoid *
используется для обозначения указатель , который указывает на некоторые данные / пространства в памяти , которая не имеет тип.void *
не может быть разыменовано само по себе, и должно быть сначала приведено к другому типу. Это приведение не обязательно должно быть явным вC
, но должно быть явным вC++
. (Вот почему мы не приводим возвращаемое значение mallocvoid *
.)При использовании с функцией в качестве параметра
void
означает полное отсутствие каких-либо параметров и является единственным допустимым параметром. Попытка использовать void как тип переменной или включить другие аргументы приводит к ошибке компилятора:Аналогичным образом невозможно объявить переменную с типом
void
:void
как возвращаемое значение для функции указывает, что данные не будут возвращены. Поскольку невозможно объявить переменную типаvoid
, невозможно поймать возвращаемое значениеvoid
функции, даже с указателем void.Несовершенство
void *
- это другой случай. Пустой указатель указывает указатель на местоположение в памяти, но не указывает тип данных в этом указателе. (Это используется для достижения полиморфизма в C , например, с помощью функции qsort () .) Однако эти указатели могут быть сложны в использовании, поскольку очень легко случайно привести их к неправильному типу. Приведенный ниже код не будет выдавать никаких ошибок компилятораC
, но приведет к неопределенному поведению:Следующий код, однако, совершенно легален; приведение к пустому указателю и обратно никогда не изменяет его значение.
Как параметр функции
void *
указывает, что тип данных в указателе, который вы передаете, неизвестен, и вы, программист, должны правильно обрабатывать все, что находится в этом месте памяти. В качестве возвращаемого значенияvoid *
указывает, что тип возвращаемых данных неизвестен или не имеет типов и должен обрабатываться программой.tl; dr
void
в прототипе функции означает «нет данных» и указывает на отсутствие возвращаемого значения или параметров,void *
в прототипе функции означает «данные в указателе, которому дана эта функция, не имеют известного типа» и указывают параметр или возвращаемое значение чей указатель должен быть приведен к другому типу, прежде чем данные в указателе могут быть использованы.источник
void * ... must be cast to another type first, but may be done so without an explicit cast.
Не верно в C ++. В C ++ форма преобразованияvoid*
должна быть явной. PS вызов явного приведения является избыточным, поскольку приведение по определению является явным преобразованием.foo(void)
- функция без параметровfoo(void *)
- функция с однимvoid *
параметромЧто такое
void *
? Это просто указатель на данные без определенного типа. Может быть приведен к любому другому типу указателя.источник
(type) vs. (type *)
вселенной пар, потому что void на самом деле не тип.Есть разница:
int foo(void)
объявляет функцию, которая не принимает аргументов.int foo(void *)
объявляет функцию, которая принимает один аргумент типаvoid*
.В C ++
int foo(void)
это эквивалентноint foo()
.источник