Void Pointers
2 participantes
Página 1 de 1
Void Pointers
Estou com uma dúvida em relação a ponteiros void. Entendi que são muito úteis por serem genéricos e assim eles podem apontar para qualquer tipo de dado, por outro lado eles têm uma grande restrição pelo fato de não ser possível dereferenciá-los sem fazer uma conversão.
Mas analisando o seguinte fragmento de código em C++ :
int i = 5;
void *pv; // ponteiro genérico
pv = &i; // endereço de um int
cout << *pv; //ERRO
fiquei pensando que realmente pela declaração do ponteiro não há um tipo para dereferenciar, mas o compilador não sabe que o valor apontado é do tipo int através da instrução → pv = &i; ?
Mas analisando o seguinte fragmento de código em C++ :
int i = 5;
void *pv; // ponteiro genérico
pv = &i; // endereço de um int
cout << *pv; //ERRO
fiquei pensando que realmente pela declaração do ponteiro não há um tipo para dereferenciar, mas o compilador não sabe que o valor apontado é do tipo int através da instrução → pv = &i; ?
Fis_física- Iniciante
- Mensagens : 40
Data de inscrição : 18/12/2015
Idade : 25
Localização : São Paulo
Re: Void Pointers
Ele pega o endereço da variável na memória. Mas como saberá o tamanho dela na memória (ou seja, seu tipo)?
O compilador poderia fazer isso por pegar o tipo da variável endereçada no ponteiro dentro do seu código e mudar o tipo do ponteiro. Mas e se você usasse esse ponteiro para outro tipo de variável depois? Ponteiros servem para endereços de memória. Você pode mudar o valor deles (ou seja, qual endereço estão apontando) a qualquer momento. Se ele é um ponteiro de um tipo específico, você só pode mudar para um endereço de memória que contenha um valor do tipo especificado. Mas, no caso de um "void pointer", você pode associar a qualquer tipo. E ele não teria como saber, ou adivinhar, qual tipo você está apontando agora. Se você vai apontar para um único tipo sempre, então não faria sentido usar um "void pointer".
E claro: o ponteiro do tipo void não carrega informação de qual tipo de valor ele está guardando. Seria necessário mais um byte para isso. Não sei se é o principal motivo de terem assim escolhido, mas com certeza é um deles.
O compilador poderia fazer isso por pegar o tipo da variável endereçada no ponteiro dentro do seu código e mudar o tipo do ponteiro. Mas e se você usasse esse ponteiro para outro tipo de variável depois? Ponteiros servem para endereços de memória. Você pode mudar o valor deles (ou seja, qual endereço estão apontando) a qualquer momento. Se ele é um ponteiro de um tipo específico, você só pode mudar para um endereço de memória que contenha um valor do tipo especificado. Mas, no caso de um "void pointer", você pode associar a qualquer tipo. E ele não teria como saber, ou adivinhar, qual tipo você está apontando agora. Se você vai apontar para um único tipo sempre, então não faria sentido usar um "void pointer".
E claro: o ponteiro do tipo void não carrega informação de qual tipo de valor ele está guardando. Seria necessário mais um byte para isso. Não sei se é o principal motivo de terem assim escolhido, mas com certeza é um deles.
PedroX- Administração
- Mensagens : 1040
Data de inscrição : 24/08/2011
Idade : 28
Localização : Campinas - SP
Re: Void Pointers
O que eu tinha pensado era o seguinte : se o compilador sabe que a variável i foi declarada com o tipo int, quando o endereço de i for passado ao ponteiro, ele sabe que o valor apontado é do tipo int. Eu havia entendido assim, estou errado ?
Fis_física- Iniciante
- Mensagens : 40
Data de inscrição : 18/12/2015
Idade : 25
Localização : São Paulo
Re: Void Pointers
Seria a sequência desse jeito ? Quando tem a declaração da variável i, o compilador vai na memória e deixa i localizada em um endereço, com o respectivo tamanho do tipo int. Depois, quando o ponteiro é declarado, ele vai e coloca o ponteiro em um determinado endereço. Mas quando volta em i para pegar o endereço da variável para armazenar no ponteiro ele "não sabe mais" o tamanho de i, seria isso ?
Fis_física- Iniciante
- Mensagens : 40
Data de inscrição : 18/12/2015
Idade : 25
Localização : São Paulo
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|