¿Qué es un puntero void en C++? [duplicar]


Posible Duplicado:
¿Qué es un puntero nulo y qué es un puntero nulo?

A menudo veo código que se parece a algo como lo siguiente:

void * foo(int bar);

¿Qué significa esto? ¿Significa que puede devolver cualquier cosa ? Es esto similar a dynamic o object en C#?

Author: Community, 2011-12-16

4 answers

A void* no significa nada. Es un puntero, pero el tipo al que apunta no se conoce.

No es que pueda devolver "cualquier cosa". Una función que devuelve un void* generalmente está haciendo una de las siguientes cosas:

  • Se trata de una memoria sin formato. Esto es lo que operator new y malloc devuelven: un puntero a un bloque de memoria de cierto tamaño. Dado que la memoria no tiene un tipo (porque todavía no tiene un objeto construido correctamente), no tiene tipo. IE: void.
  • Es un identificador opaco; hace referencia a un objeto creado sin nombrar un tipo específico. El código que hace esto generalmente está mal formado, ya que esto se hace mejor declarando una estructura/clase y simplemente no proporcionando una definición pública para ella. Porque entonces, al menos tiene un tipo real.
  • Devuelve un puntero al almacenamiento que contiene un objeto de un tipo conocido. Sin embargo, esa API se utiliza para tratar con objetos de una amplia variedad de tipos, por lo que el tipo exacto que un no se pueden conocer los retornos de llamadas particulares en tiempo de compilación. Por lo tanto, habrá alguna documentación que explique cuándo almacena qué tipos de objetos y, por lo tanto, a qué tipo puede enviarlo de forma segura.

Esta construcción es nada como dynamic o object en C#. Esas herramientas realmente saben cuál es el tipo original; void* no lo hace. Esto lo hace mucho más peligroso que cualquiera de ellos, porque es muy fácil equivocarse, y no hay manera de preguntar si un el uso particular es el correcto.

Y en una nota personal, si ves código que usa void*'s "a menudo", deberías repensar qué código estás mirando. void*el uso, especialmente en C++, debería ser raro, usado primario para tratar en memoria raw.

 75
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-14 23:35:35

Void se usa como palabra clave. El puntero void , también conocido como el puntero genérico, es un tipo especial de puntero que puede apuntar a objetos de cualquier tipo de datos! Un puntero void se declara como un puntero normal, usando la palabra clave void como el tipo del puntero:

Sintaxis general:

void* pointer_variable;

void *pVoid; // pVoid is a void pointer

Un puntero void puede apuntar a objetos de cualquier tipo de datos:

int nValue;
float fValue;

struct Something
{
    int nValue;
    float fValue;
};

Something sValue;

void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid

Sin embargo, debido a que el puntero void no sabe a qué tipo de objeto está apuntando, no puede ser ¡desreferenciado! Más bien, el puntero void primero debe ser explícitamente a otro tipo de puntero antes de que se eliminan las referencias.

int nValue = 5;
void *pVoid = &nValue;

// can not dereference pVoid because it is a void pointer

int *pInt = static_cast<int*>(pVoid); // cast from void* to int*

cout << *pInt << endl; // can dereference pInt

Fuente: enlace

 24
Author: User1988,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-14 12:39:15

Un puntero void* se utiliza cuando se desea indicar un puntero a un trozo de memoria sin especificar el tipo. C's malloc devuelve tal puntero, esperando que lo castee a un tipo particular inmediatamente. Realmente no es útil hasta que lo lanzas a otro tipo de puntero. Se espera que sepa a qué tipo enviarlo, el compilador no tiene capacidad de reflexión para saber cuál debe ser el tipo subyacente.

 23
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 05:18:56

Un void* puede apuntar a cualquier cosa (es un puntero raw sin ninguna información de tipo).

 4
Author: axon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-16 05:15:58