Hablando funcional y sintácticamente, ¿hay alguna diferencia entre una función cuyo prototipo es int foo(void)y int foo(void *)?
Sé la diferencia entre, por ejemplo, int bar(int)y int bar(int *)- uno de ellos está buscando un int, y el otro está buscando un puntero int. ¿Se voidcomporta de la misma manera?
c++
c
function-prototypes
Nick Reed
fuente
fuente

foo(void)yfoo().Respuestas:
A partir de esta respuesta sobre Ingeniería de Software,
voidse trata especialmente dependiendo de cómo se use. EnCyC++,voidse usa para indicar la ausencia de un tipo de datos, mientras quevoid *se usa para indicar un puntero que apunta a algunos datos / espacio en la memoria que no tiene un tipo.void *no se puede desreferenciar por sí solo, y primero se debe convertir a otro tipo. Este reparto no necesita ser explícito enC, pero debe ser explícito enC++. (Es por eso que no arrojamos el valor de retorno de malloc, que esvoid *).Cuando se usa con una función como parámetro,
voidsignifica la ausencia total de cualquier parámetro, y es el único parámetro permitido. Intentar usar void como un tipo de variable o incluir otros argumentos da como resultado un error del compilador:Es igualmente imposible declarar una variable con tipo
void:voidcomo un valor de retorno para una función indica que no se devolverán datos. Como es imposible declarar una variable de tipovoid, es imposible capturar el valor de retorno de unavoidfunción, incluso con un puntero nulo.El sin tipo
void *es un caso diferente. Un puntero nulo indica un puntero a una ubicación en la memoria, pero no indica el tipo de datos en ese puntero. (Esto se usa para lograr el polimorfismo en C , como con la función qsort ()) . Sin embargo, estos punteros pueden ser difíciles de usar, ya que es muy fácil lanzarlos accidentalmente al tipo incorrecto. El siguiente código no arrojará ningún error del compiladorC, pero da como resultado un comportamiento indefinido:El siguiente código, sin embargo, es perfectamente legal; lanzar hacia y desde un puntero vacío nunca cambia el valor que tiene.
Como parámetro de función,
void *indica que se desconoce el tipo de datos en el puntero que está pasando, y depende de usted, el programador, manejar adecuadamente lo que esté en esa ubicación de memoria. Como valor de retorno,void *indica que el tipo de datos que se devuelve no se conoce o no tiene tipo, y el programa debe manejarlo.tl; dr
voiden un prototipo de función significa "sin datos" e indica que no hay valor de retorno o ningún parámetro,void *en un prototipo de función significa que "los datos en el puntero que se da esta función no tienen un tipo conocido" e indica un parámetro o valor de retorno cuyo puntero debe convertirse a un tipo diferente antes de que se puedan utilizar los datos en el puntero.fuente
void * ... must be cast to another type first, but may be done so without an explicit cast.No es cierto en C ++. En C ++, la forma de conversiónvoid*debe ser explícita. PS que llama a un cast explícito es redundante, ya que el cast es, por definición, una conversión explícita.foo(void)- función sin parámetrosfoo(void *)- función con unvoid *parámetro¿Qué es
void *? Es solo el puntero a los datos sin un tipo especificado. Se puede lanzar a cualquier otro tipo de punterofuente
(type) vs. (type *)universo de las parejas porque el vacío no es realmente un tipo.Hay una diferencia:
int foo(void)declara una función que no acepta argumentos.int foo(void *)declara una función que acepta un solo argumento de tipovoid*.En C ++,
int foo(void)es equivalente aint foo().fuente