Ponteiros void na linguagem C
O ponteiro do tipo mais discriminado que existe. Será uma solução? Será uma inutilidade? Leia esta série de dois artigos e decida se ele é a opção que lhe falta ou não.
Introdução
Inicialmente quero dizer que o artigo trata sobre ponteiros void
sobre a linguagem C e demonstra como podemos utilizá-lo. Assim, é
primordial um conhecimento anterior da linguagem C, principalmente
sobre ponteiros e tipos de dados. Espero que todos gostem do artigo.
Qualquer dúvida estou sempre a disposição.
Antes de falarmos de ponteiros, falaremos sobre o tipo void. Essa é uma excelente forma de começar o artigo, pois faz lembrarmos o que ele deve armazenar. Assim, sinta-se a vontade para pular essa parte. Já que não temos como saber os conhecimentos prévios de uma pessoa. Além disso, é essa explicação sobre tipos que nos ajudará a entender o comportamento do ponteiro e a termos idéias quando houverem problemas.
O tipo void é uma das exceções das regras de tipo. Todos os tipos básicos que existem servem para armazenar alguma espécie de dado definido num tamanho. Exemplos que posso citar são:
s É desnecessário dizer que alguns desses tamanhos podem variar conforme for. O tipo void possui tamanho igual a 1 byte, mas não serve para armazenar dados de qualquer tipo. Assim, o "void" é uma excessão a regra de tipos básicos, já que ele muitas vezes nem é considerado um tipo. Mas, podemos dizer que void é o tipo que armazena dados vazios. Assim, ele não seria uma excessão. Outra coisa é que ele é normalmente achado em códigos aparecendo como abaixo:
O tipo void
Antes de falarmos de ponteiros, falaremos sobre o tipo void. Essa é uma excelente forma de começar o artigo, pois faz lembrarmos o que ele deve armazenar. Assim, sinta-se a vontade para pular essa parte. Já que não temos como saber os conhecimentos prévios de uma pessoa. Além disso, é essa explicação sobre tipos que nos ajudará a entender o comportamento do ponteiro e a termos idéias quando houverem problemas.
O tipo void é uma das exceções das regras de tipo. Todos os tipos básicos que existem servem para armazenar alguma espécie de dado definido num tamanho. Exemplos que posso citar são:
- char com 1 byte;
- int com 4 bytes;
- float com 4 byte;s
- double com 8 byte.
s É desnecessário dizer que alguns desses tamanhos podem variar conforme for. O tipo void possui tamanho igual a 1 byte, mas não serve para armazenar dados de qualquer tipo. Assim, o "void" é uma excessão a regra de tipos básicos, já que ele muitas vezes nem é considerado um tipo. Mas, podemos dizer que void é o tipo que armazena dados vazios. Assim, ele não seria uma excessão. Outra coisa é que ele é normalmente achado em códigos aparecendo como abaixo:
#include <stdio.h>
void main( void )
{
int x;
printf("%d", x);
}
Assim, o tipo void é usado quando queremos, ou melhor, quando não queremos dados armazenados nele. Esse é um conceito fácil de se entender, pois em funções que não retornam nada devemos colocar void. Além disso, podemos colocar void para explicitar que não há parâmetros como no caso acima.
Ponteiros void
Vamos começar a falar sobre ponteiros void. A primeira pergunta que nos vem a cabeça quando falamos de um ponteiro com esse tipo é como podemos utilizá-los e o primeiro pensamento é algo próximo disso:
#include <stdio.h>
void main( void )
{
int x = 5;
void *y = &x;
*y = 9;
}
Para quem leu o que falei sobre tipos void, sabe que quem tentar fazer isso terá como retorno um erro. Mas ele está logicamente correto, já que podemos atribuir o valor "9" ao conteúdo de y.
Um apontador do tipo void aponta para um tipo vazio do tamanho igual a um byte. Mas, mesmo tendo o mesmo tamanho de um char, a conversão de tipos não é apropriada a nenhum tipo existente (seja básico ou não). Isto é, o ponteiro void somente aponta para void, pois é esse o tipo do seu ponteiro.
Assim, uma forma simples de demonstrar como o "void *" pode ser útil para armazenar endereços é esta:
#include <stdio.h>
void main( void )
{
int x = 5;
void *y = &x;
int *z;
z = y;
*z = 9;
}
Assim, chegamos a seguinte conclusão:
- Um ponteiro só pode apontar para o seu tipo.
- Não podemos armazenar nada em tipo void.
- Só pode armazenar endereços de memória em void*.
Dentre as três regras, as duas primeiras já deveríamos estar acostumados. A "nova" - a última regra - é o que garante generabilidade para o tipo void.
Esperem pela segunda parte!
Qualquer dúvida email-me.
[]'s
Só não entendi muito bem sua utilidade. O ponteiro de void pode armazenar
qualquer tipo de ponteiro sem dar erro?