Com esse artigo pretendo desvendar alguns dos segredos de ponteiros na linguagem C, estes tão temidos pelos iniciantes da linguagem. Sem mais, Hey! Ho! Let´s GO!
Como a maioria de nós já sabe, para se definir um ponteiro
devemos colocar um asterisco (*) entre o tipo e o nome da
variável.
Exemplo:
int *a;
É importante lembrar que quando definimos um ponteiro,
estamos alocando o espaço para o endereço de memória apontado
e não para o valor.
Para usar um ponteiro, devemos sempre inicializá-lo, NUNCA NA
DECLARAÇÃO, ou seja, colocar um endereço válido para depois
fazer acesso ao valor alocado no endereço de memória apontado.
O exemplo a seguir demonstra bem o que quero dizer:
#include <stdio.h>
int main()
{
int *a; /*Declaração de um ponteiro de inteiros*/
int b = 10; /*Declaração e inicialização de uma variável com um inteiro 10*/
a = &b; /*o ponteiro a recebe o endereço de memória da variável b */
/* É importante lembrar que o '&' refere-se ao endereço de memória onde a variável foi criada. Portanto, após a execução dessa linha o ponteiro a está apontando para o endereço de memória da variável b, que contém o valor inteiro 10. */
printf("\nO ponteiro a aponta para um endereço ");
printf("de memória que contém o valor %d .\n",*a);
return 0;
}
Bom, até o momento aprendemos como declarar variáveis do tipo
ponteiro, aproveitando um pouco do exemplo acima vamos entender
como usar efetivamente ponteiros. Como você pode perceber no
exemplo acima, estamos trabalhando com o endereço apontado pelo
ponteiro. Talvez você esteja se perguntado: como assim? A
tabela a seguir vai te ajudar a entender melhor o que quero
explicar.
Considere as seguintes variáveis:
int *a; /*Ponteiro*/
int b;
Podemos manipular essas variáveis utilizando alguns "indicadores".
PONTEIRO
-
VARIÁVEL
O que faz?
*a
-
-
Conteúdo do endereço
apontado pelo ponteiro.
a
-
b
Conteúdo da variável ou
ponteiro, no caso do ponteiro o endereço apontado.
&a
-
&b
Endereço de memória
onde foi criado a variável ou ponteiro.
Conclusão
Espero ter sido claro em minhas explicações, caso tenham tido
alguma dúvida ou se não fui claro em algum aspecto, por favor
entrem em contato.
[2] Comentário enviado por franklinbr em 30/03/2005 - 10:21h
Arthur !!!
Ae cara, acho que sua explicacoes sobre ponteiros ficou um tanto vago, e não vejo nada de diferente que geralmente as apostilas tradicionais encontradas pela net trazem. Você apenas descreveu o que eh um ponteiro (de uma forma superficial do ponto de vista didatico). Podia dizer sobre onde realmente aplicamos um ponteiro e em que condições ele possa facilitar ou simplificar nosso codigo, e fazendo referencias a parametros externos (mais conhecidos como argc e argv). E isso ae.... desculpe se parece chato .....
[4] Comentário enviado por removido em 30/03/2005 - 13:33h
concordo com você amigos, tenho conciencia que existem artigos melhorem e que faltaram assuntos a serem abordados. mas o objetivo do artigo não era se aprofundar no estudo de ponteiros, e sim tirar dúvidas BÁSICAS, de forma simples e superficial, sobre ponteiros.Desculpe se não atendi as suas espectativas, no próximo artigo especificarei melhor o tema que irei abordar. Se vocês quiserem se aprofundar no estudo de ponteiros recomendo a leitura de um livro muito bom chamado "The C Programming Language" de Ritchie & Kernighan, o capitulo 5 deste livro aborda muito bem este assunto.
[5] Comentário enviado por jllucca em 30/03/2005 - 21:50h
Arthur,
Seu artigo está muito básico. Fora isso achei que faltou um pouco de esforço por sua parte, mas já da pra sentir que tem potencial. Infelizmente, achei duas afirmações que ficam no minimo ambiguas no entendimento...
"Existem dois grandes problemas quando falamos de ponteiros: distinguir quando estamos trabalhando com seu valor, ou seja, o endereço apontado e quando estamos trabalhando com a informação apontada por ele."
Nesse paragrafo acima, temos um probleminha de ambiguidade comum, pois o valor do ponteiro é o endereço da variavel. Mas, uma mente aprendendo pode ligar valor com o valor de onde o ponteiro aponta(variavel apontada?). Mesmo nesse caso querendo dizer o endereço contido no ponteiro.
"Para usar um ponteiro, devemos sempre inicializá-lo, NUNCA NA DECLARAÇÃO, ou seja, colocar um endereço válido para depois fazer acesso ao valor alocado no endereço de memória apontado."
Aqui, o problema está justamente onde voce chamou atenção... Porque não podemos iniciar um ponteiro na declaração? Iniciar um ponteiro é alocar a memoria pra onde ele vai apontar então porque não unir o útil(declarar o ponteiro) ao agradavel(alocar a memoria usada pelo ponteiro)?
Ainda não entrando em "malloc's" da vida porque não fazer:
{
int b = 10;
int *a = &b; // porque nunca iniciar o ponteiro na declaração?
(...)
}
Bom, o que espero com essas perguntas é tentar chamar atenção para reflexão. Não sou o dono da verdade e sempre gosto de debater sobre o que me parecem "errinhos", numa tentativa de estimular o pessoal.
[6] Comentário enviado por removido em 30/03/2005 - 23:41h
Primeiramente gostaria de pedir desculpas se fui um pouco agressivo em minha resposta.
Gostei muito de sua crítica Ricardo, com certeza tomarei mais cuidado ao escrever um novo artigo, e tentarei ter mais vontate em tornar o material escrito mais didático. ;)
Quando mencionei em "Para usar um ponteiro, devemos sempre inicializá-lo, NUNCA NA DECLARAÇÃO," tentei transmitir o que considero como uma boa prática de programação, entendo que não fui claro na explicação. Tenho a visão de que falhei em alguns pontos, e agradeço as críticas construtivas, pois a partir delas terei nova motivação em escrever artigos com melhor qualidade.
[7] Comentário enviado por fredwind em 30/09/2005 - 14:55h
E aew brother!!! ta massa tua explikção kra, pra quem ta aprendendo so vai mermu c for de vagarinho!!!! se tivesse aprofundado um pouquinho mais tria fikdo melhor!! mais ta joia assim!!!
[10] Comentário enviado por TRBaldim em 21/03/2010 - 16:40h
Me desculpe mas realmente este artigo sobre ponteiros está muito, muito vago meeeeesmo... Lendo a primeira página simplesmente me imaginei na época quando estava começando a programar em C e não entendia o que era ponteiro. Se eu pegasse esse artigo para tentar entender... Eu iria me confundir ainda mais...
[12] Comentário enviado por Nitro em 04/04/2010 - 00:37h
Só lembrando que fazendo parte de uma comunidade livre e que nesse caso não recebemos NADA pelos artigos temos que ter cuidado ao criticar um artigo. Afinal o "removido" não recebeu nenhuma graninha pelos artigos. Portando elogios ao inves de criticas serviriam muito como incentivo e motivação para que o "removido" continue a publicar artigos que possam ajudar. Embora esse tenha sido curto e pouco explorado como alguns aqui disseram, deu para ter uma noção do que é um ponteiro.
De forma que eu gostaria de agradecer o "removido" pelo artigo e que os comentários acima não te desestimule a contribuir com outros artigos.
Lembre-se:
Amadores contruiram a Arca de Noé e Profissionais o Titanic
[13] Comentário enviado por mfs em 12/04/2010 - 00:50h
O grande problema é que ponteiro sempre foi e ainda é uma das maiores dificuldades para quem ta aprendendo C. E os exemplos mais básicos de ponteiros que são os que normalmente encontramos são facilmente resolvidos de outras formas, sem ponteiros. Mas como nada se aprende começando do difícil, o artigo é muito bom para quem ta tendo seu primeiro contato com ponteiros. Como o próprio título sugere é uma introdução a ponteiros.