sexta-feira, 14 de março de 2014

Ponteiros em Linguagem C

Como funcionam os ponteiros em C?

Essa é a pergunta campeã em sala de aula, por isso resolvi compartilhar aqui. Então vamos lá!

Se voltarmos à definição de variável, que é um espaço alocado na memória, podemos imaginar o seguinte:

1 - Quando declaramos uma variável, um espaço é reservado/alocado na memória do seu computador.
2 - Esse espaço que foi reservado/alocado tem um nome que foi dado pelo programador. Ex: int minha_variavel;
3 - Mesmo definindo um nome para a variável (no caso acima "minha_variavel") ela possui um endereço físico, por exemplo 0x4A1, que é o endereço de memória onde a variável, de fato, reside.

Pois bem, o que geralemente explico é que um ponteiro nada mais é do que uma variável que guarda o endereço de outra variável ou mesmo um endereço de memória. A imagem abaixo demonsta bem isso.


No caso acima, a variável "A" possui o valor "5" e o endereço de memória "0x3E8", já o ponteiro "p" possui o valor do "0x3E8" que é o endereço de "A" e possui seu próprio endereço "0x3C0".

Pronto, sabendo disso, podemos demostrar um algoritmo exemplo, mas antes precisamos saber a sintaxe de declaração de ponteiros, que para a linguagem C (o exemplo abaixo foi feito no DEV C++) é apenas colocar um asterísco antes do nome do ponteiro, como pode ser visto na linha 6 do algoritmo exemplo.

Seguindo o algoritmo exemplo, verificamos que na linha 8 a variável "a" recebe o valor inteiro 32, e na sequência (linha 9) o ponteiro "b" recebe o endereço de memória de "a" (o  & na linguagem C é o operador de endereço, retornando o endereço físico da variável), ou seja, "b" aponta para "a", por isso chamamos de ponteiro!

Por fim, fiz vários printf's para demonstrar o valor de cada um dos elementos envolvidos. Perceba que na linha 15 imprimo o ponteiro "b" precidido de um asterísco "*", que nesse caso significa que será impresso o conteúdo de quem o ponteiro "b" aponta (não confunda com o asterísco na declaração do ponteiro!).


  1. #include
  2. #include

  3. main(){
  4.  int a;
  5.  int *b;

  6.  a = 32;
  7.  b = &a;

  8.  printf("Eu sou o conteudo de A: %d\n", a);
  9.  printf("Eu sou o endereco de A: %x\n", &a);
  10.  printf("Eu sou o conteudo de B: %x\n", b);
  11.  printf("Eu sou o endereco de B: %x\n", &b);
  12.  printf("Eu sou o A através de B: %d\n", *b);

  13.  system("pause");
  14. }

É isso, espero que esse post ajude a entender nossos famosos ponteiros!

Um abraço!

Nenhum comentário: