Nessa seqüência continuarei falando sobre como podemos utilizar esses ponteiros tão discriminados e a melhor forma de usar a atribuição neles. Além disso mostrarei como podemos usar ponteiros void para construirmos uma fila genérica que pode literalmente guardar qualquer tipo de dado.
Para uma mente curiosa, dúvidas estão sempre fluindo e sendo respondidas. Alguma vez
você já se perguntou porque devemos sempre "castar" (type casting) o ponteiro retornado
por "malloc" para o tipo desejado? É isso mesmo! Malloc retorna um ponteiro para void!!!
Assim, podemos ter algo como:
void *x;
x = malloc( sizeof( double ) );
O trecho acima faz com que malloc aponte para um lugar reservado que é
capaz de conter um double. Podemos setar um valor no apontado por "x" da seguinte forma:
double y = 9;
memcpy( x, y, sizeof(y) );
Isso faz com que o valor "y" seja guardado em "x", sem "x" ter nenhuma ligação com "y"
como nós vínhamos usando.
Vamos a um exemplo mais detalhado... Dado uma variável inteira, queremos guardar seu
conteúdo em um ponteiro void e retornar esse valor para uma outra variável inteira.
void *x = NULL;
int n1 = 5, n2 = 9;
printf("%d %d\n", n1, n2); // escreve 5 e 9
x = malloc( sizeof( int ) );
memcpy( x, n1, sizeof(n1) ); //guarda o 5 em x
printf("%d %d\n", n1, n2); // escreve 5 e 9
n2 = *((int *) x);
printf("%d %d\n", n1, n2); // escreve 5 e 5
O trecho de programa acima está correto. Alguns compiladores podem reclamar da
falta do cast do retorno de malloc. Mas, não é nada para se preocupar...
[2] Comentário enviado por ymc em 11/06/2004 - 08:22h
Este artigo com certeza completa o primeiro. Antes estava meio vago a utilidade do ponteiro void. Com este artigo ficou mais claro pra mim e tirou algumas duvidas sobre malloc.
Otimo artigo.
[3] Comentário enviado por robson.dantas em 13/06/2004 - 09:53h
Muito bom o seu artigo.
Tenho preparado algo sobre ponteiros void, para C++; Criei uma classe genérica, que faz acesso à dados em C++ para bancos como postgres, mySQL, SQL Server e Oracle;
[4] Comentário enviado por jllucca em 14/06/2004 - 19:43h
ymc,
certamente que completa o primeiro! Como disse no inicio do segundo, eu dividi o assunto pra deixar a parte "pratica" para ser tratada nesse artigo. Mas, para quem ler o conteúdo desse segundo artigo esta no primeiro só que mais direto e sem precisar "fritas os miolos",
[5] Comentário enviado por jllucca em 14/06/2004 - 19:45h
Robson,
sobre o que eu acho é o seguinte void é excelente para C. Mas, em C++ temos algumas coisas que nos auxiliam que podem ser até melhores que o void. No seu caso, voce já pensou em usar template? Eu não conhecia isso em C++, mas seria uma alternativa mais elegante até para a classe que coloquei na sessão scripts.
[6] Comentário enviado por engos em 25/06/2004 - 10:47h
Achei bem vago esse segundo artigo, me deixou a impressão que você correu para completar o primeiro e atropelou um pouco a teoria e deixo que o conceito prático explicasse tudo por si só.
Como você mesmo disse, é o primeiro artigo de forma prática, existiu um complementar, mas nada de muito interessante.
Gostei do primeiro artigo, mas esse segundo foi mediano, entretanto deu para perceber que você conhece bem sobre o assunto, que tal um terceiro artigo mais elaborado, com conceitos técnicos e práticos proporcionais e exemplos para serem usados no cotidiano?
Lendo esse segundo fiquei com a seguinte dúvida:
Em quesito de desempenho, onde está a vantagem?
[7] Comentário enviado por roxcorp em 02/11/2004 - 18:24h
Ola jllucca,
Fila nao eh FIFO? Quando removo um da fila ele tem que me entregar o primeiro que entrou e nao o ultimo. Isso que vc implementou acima eh uma pilha. FILO.
Abraco. Quaquer coisa me fala se eu estiver errado: tiago@roxcorp.com