Ponteiros void na linguagem C (parte 2)

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.

[ Hits: 57.474 ]

Por: Ricardo Rodrigues Lucca em 09/06/2004 | Blog: http://aventurasdeumdevop.blogspot.com.br/


Atribuição



Alocação Dinâmica


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

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Atribuição
   3. Teoria do void
   4. Fila
   5. Concluindo
Outros artigos deste autor

Utilizando a função QSort em C

Linux no Rio Grande do Sul

Apreendendo a utilizar o GNU Debugger (parte 2)

VIM avançado (parte 1)

VIM avançado (parte 2)

Leitura recomendada

Detectando assalto na multidão com visão computacional

Aprendendo a utilizar o GNU Debugger (parte 1)

Substituindo a biblioteca conio.h no Linux usando ncurses curses.h

Aleatoriedade em C

Apreendendo a utilizar o GNU Debugger (parte 2)

  
Comentários
[1] Comentário enviado por lorenzi em 10/06/2004 - 00:26h

muito bom o artigo para quem ja programa ou que esta comecando a usar a linguagem C.

[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;

o que acha sobre o assunto ?

--
Robson

[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",

[]'s

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

[]'s

[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: [email protected]

Tiago

[8] Comentário enviado por jllucca em 07/11/2004 - 20:22h

Olá,

Estou me comunicando com o roxcorp por email,

mas o programa da pagina quatro está correto. Acabei de testa-lo aqui e ele realiza um FIFO e não um FILO como ele alega.

A lista: 0 1 2 3 4

Ao ser removido dois elementos ficou: 2 3 4

Em FILO, seria: 0 1 2
Mas, não aconteceu. :-)

Como disse, estou falando por email com ele para vermos esse impasse.

[]'s

[9] Comentário enviado por kernel_sys em 10/10/2005 - 13:40h

Muito bom artigo mesmo , parabens


Contribuir com comentário