c++ - son - ¿Qué es el tipo de datos de PVOID?
tipos de datos primitivos en c++ (6)
¿Puede alguien explicar qué es PVOID
y cómo se usa en una función como:
BOOL DoSomething(PVOID pMemPhy)
Como han dicho otros, es equivalente a void *
.
void
punteros void
se usan a menudo en las operaciones de memoria ( memcpy
, memset
, etc ...) ya que uno no quiere asumir el tipo de datos en la dirección dada.
Los punteros y los indicadores de vacíos reciben un buen tratamiento en este artículo de http://cplusplus.com .
Es un puntero de vacío : un puntero a una dirección de memoria sin información sobre el tipo de valor al que apunta. Por este motivo, debe convertir el puntero a un tipo como (char *)pMemPhy
o (int *)pMemPhy
antes de usar el puntero para que el compilador sepa con qué memoria está trabajando (1 byte para un carácter, 4 bytes para un int, etc.)
Esto y otros mnemotécnicos como BOOL, LPCTSTR tienen su origen en Windows, que por cierto se desarrolló antes de la existencia de un estándar C, y para no depender de un compilador en particular, utilizaba sus propios tipos.
Puede consultar el blog Old New Thing para obtener más historias sobre el historial de desarrollo de Windows y sus curiosidades que permanecerán con nosotros ( http://blogs.msdn.com/oldnewthing ).
Parece que es solo un alias (define o typedef) para void *. No tengo idea de por qué las personas piensan que sería mejor, pero sé que a algunas API les gusta usar eso en caso de que la implementación de un tipo cambie en el futuro.
Sé que las primeras versiones de Windows usaban cosas como STDCALL como prefijo de muchas funciones y la definición de STDCALL podía cambiar en función de la versión de Windows para la que se compiló. Esto es de memoria (que se ve afectado por el alcohol después de muchos años :-), así que no confíe en esto como un evangelio. Es básicamente correcto, pero los detalles pueden ser un poco diferentes.
puntero void, igual que
void *pMemPhy
alias "Puntero a algo, pero depende de usted resolverlo".
BOOL DoSomething ( PVOID pMemPhy )
{
strcpy((char *)pMemPhy, "I love buffer overflows!");
return TRUE;
}
typedef void * PVOID;
Si tu pregunta es ¿para qué sirve un puntero de vacío? El uso más común es cuando pasa un puntero a la memoria que realmente no le importa el tipo. libre (), por ejemplo.
Si una biblioteca exporta una función que puede tomar varios tipos de puntero, pero quiere admitir lenguajes como C que no tienen sobrecarga de función, entonces void * funciona.