it-swarm-pt.tech

O que é um ponteiro vazio em C ++?

Possível Duplicar:
O que é um ponteiro vazio e o que é um ponteiro nulo?

Muitas vezes vejo código que se assemelha a algo como o seguinte:

void * foo(int bar);

O que isto significa? Isso significa que ele pode retornar qualquer coisa ? Isso é semelhante a dynamic ou object em C #?

75
zeboidlund

Um void* não significa nada. É um ponteiro, mas o tipo para o qual ele aponta não é conhecido.

Não é que ele possa retornar "qualquer coisa". Uma função que retorna um void* geralmente está fazendo o seguinte:

  • Está lidando com memória não formatada. Isto é o que operator new e malloc retornam: um ponteiro para um bloco de memória de um certo tamanho. Como a memória não possui um tipo (porque ainda não possui um objeto adequadamente construído), ela é sem tipo. IE: void.
  • É uma alça opaca; ele faz referência a um objeto criado sem nomear um tipo específico. O código que faz isso geralmente é mal formado, já que isso é melhor feito pelo forward declarando uma struct/class e simplesmente não fornecendo uma definição pública para ele. Porque então, pelo menos, tem um tipo real.
  • Ele retorna um ponteiro para o armazenamento que contém um objeto de um tipo conhecido. No entanto, essa API é usada para lidar com objetos de uma ampla variedade de tipos, portanto, o tipo exato que uma determinada chamada retorna não pode ser conhecido em tempo de compilação. Portanto, haverá alguma documentação explicando quando ele armazena quais tipos de objetos e, portanto, qual tipo você pode lançá-los com segurança.

Essa construção é nada como dynamic ou object em C #. Essas ferramentas realmente sabem o que é o tipo original; void*não. Isso torna muito mais perigoso do que qualquer um deles, porque é muito fácil errar, e não há como perguntar se um uso em particular é o certo.

E, em uma nota pessoal, se você vir um código que usa frequentemente o void*, você deve repensar o código que está procurando. void* usage, especialmente em C++, deve ser raro, usado como primário para lidar com memória bruta.

91
Nicol Bolas

Vazio é usado como uma palavra-chave. O ponteiro void , também conhecido como ponteiro genérico, é um tipo especial de ponteiro que pode ser apontado para objetos de qualquer tipo de dados! Um ponteiro vazio é declarado como um ponteiro normal, usando a palavra-chave void como o tipo de ponteiro:

Sintaxe Geral:

void* pointer_variable;

void *pVoid; // pVoid is a void pointer

Um ponteiro vazio pode apontar para objetos de qualquer tipo de dados:

int nValue;
float fValue;

struct Something
{
    int nValue;
    float fValue;
};

Something sValue;

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

No entanto, como o ponteiro vazio não sabe para qual tipo de objeto está apontando, ele não pode ser desreferenciado! Em vez disso, o ponteiro void deve primeiro ser convertido explicitamente em outro tipo de ponteiro antes de ser desreferenciado.

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

Fonte: link

28
User1988

Um ponteiro void* é usado quando você deseja indicar um ponteiro para um pedaço de memória sem especificar o tipo. O malloc de C retorna esse ponteiro, esperando que você o converta em um tipo específico imediatamente. Realmente não é útil até que você o converta para outro tipo de ponteiro. Espera-se que você saiba para qual tipo deseja convertê-lo, o compilador não tem capacidade de reflexão para saber qual deve ser o tipo subjacente.

23
Mark Ransom

Um vazio * pode apontar para qualquer coisa (é um ponteiro bruto sem qualquer informação de tipo).

4
axon