punteros - que es un puntero en c++
¿Qué es un puntero vacío en C++? (4)
Se utiliza un puntero void*
cuando se quiere indicar un puntero a un fragmento de memoria sin especificar el tipo. El malloc
de C devuelve ese puntero, esperando que lo conviertas 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.
Posible duplicado:
¿Qué es un puntero de vacío y un puntero nulo?
A menudo veo un 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
u object
en C #?
Un void*
no significa nada. Es un puntero, pero no se conoce el tipo al que apunta.
No es que pueda devolver "cualquier cosa". Una función que devuelve un void*
generalmente realiza una de las siguientes acciones:
- Se trata de memoria sin formato. Esto es lo que el
operator new
ymalloc
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 adecuadamente), no tiene tipo. IE:void
. - Es un mango 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 hacia adelante y simplemente no proporcionando una definición pública para ello. 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 devuelve una llamada en particular no se puede conocer en el momento de la compilación. Por lo tanto, habrá alguna documentación que explique cuándo almacena qué tipo de objetos y, por lo tanto, a qué tipo puede convertirlos de forma segura.
Esta construcción no tiene nada que ver con la dynamic
o el 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 hacerlo mal, y no hay manera de preguntar si un uso en particular es el correcto.
Y en una nota personal, si ve un código que usa el void*
"a menudo", debe volver a pensar qué código está mirando. void*
uso de void*
, especialmente en C ++, debe ser raro, y se usa principalmente para tratar con memoria en bruto.
Un void * puede apuntar a cualquier cosa (es un puntero en bruto sin ningún tipo de información).
Void se utiliza como palabra clave. El puntero de vacío , también conocido como puntero genérico, es un tipo especial de puntero que se puede apuntar a objetos de cualquier tipo de datos. Un puntero void se declara como un puntero normal, utilizando la palabra clave void como tipo de puntero:
Sintaxis general:
void* pointer_variable;
void *pVoid; // pVoid is a void pointer
Un puntero de vacío 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 de vacío no sabe a qué tipo de objeto está apuntando, no se puede eliminar la referencia. En su lugar, el puntero de vacío primero se debe convertir explícitamente a otro tipo de puntero antes de que se elimine la referencia.
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: link