Pergunta

Eu estou lendo algum código no Ogre3D implementação e eu não consigo entender o que é uma variável do tipo void * significa. O que faz um ponteiro para void média em C ++?

Foi útil?

Solução

Um ponteiro para nulo, void* pode apontar para qualquer objeto:

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

Você não pode excluir a referência, aumento ou diminuição desse ponteiro, porque você não sabe que tipo você apontar. A ideia é que void* pode ser usado para funções como memcpy que basta copiar blocos de memória ao redor, e não se preocupam com o tipo que eles copiam.

Outras dicas

É apenas um ponteiro genérico, usado para transmitir dados quando você não sabe o tipo. Você tem que lançá-lo para o tipo correto, a fim de usá-lo.

É um ponteiro bruto para um local na memória. Ele não permite que qualquer aritmética de ponteiro como char * ou * int.

Eis alguns exemplos de uso

http://theory.uwinnipeg.ca/programming/node87.html

É um ponteiro para qualquer - apenas um pedaço de memória que você pode jogar com - pode ser um objeto, pode ser um char. Você tem que elenco para fazer algo útil com ele.

Edifício da minha postagem anterior ...


ATENÇÃO: Todos os endereços de memória aqui são fictícios. Eu apenas estou fazendo-los para ilustrar um ponto.


Dada:

int data[] = {10,11,12};

Agora temos:

0xffff0000-0xffff0003  with a value of (int)(10)
0xffff0004-0xffff0007  with a value of (int)(11)
0xffff0008-0xffff000b  with a value of (int)(12)

(eu sou não indo para entrar em big-endian vs ordenação de bytes little-endian aqui.)

Se temos:

int * p = data;

Agora temos uma outra posição de memória em outro lugar, diz:

 0xaaaa0000-0xaaaa0003  with a value of (int*)0xffff0000

Podemos usar p [1] [ou * (p + 1)] para se referir a * (int *) (0xffff0004) [= 11] como sizeof (int) = 4 e 0xffff0000 + sizeof (int) = 0xffff0004.

Se temos:

void * v = data;

Agora temos uma outra posição de memória em outro lugar, diz:

 0xbbbb0000-0xbbbb0003  with a value of (void*)0xffff0000.

No entanto, o vazio não tem qualquer informação sizeof associada (). Não podemos aumentar ou diminuir o ponteiro. Não podemos excluir a referência para acessar os dados armazenados no 0xffff0000. Nós só pode utilizar o valor como um endereço de memória matéria.

Se quiser usar os dados armazenados em (* void) 0xffff0000, primeiro necessidade de lançá-lo para um tipo apropriado.

Dito isto, (void *) ainda é bastante útil como um meio de passar endereços de estruturas de dados arbitrários ao redor. Por exemplo, memset (). Não importa se eu estou zero'ing um struct tm ou struct sockaddr . Só precisamos de um ponteiro para a estrutura e seu tamanho.

(Isto deve ir sem dizer, mas ... Cuidado usando memset a zero fora uma instância de classe e, ao fazê-lo, substituindo a tabela ponteiro virtual.)

Um ponteiro nulo não pode apontar para um membro da classe em C ++.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top