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.
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