Um detalhe sutil sobre os ponteiros

O que é um ponteiro ?

Costuma-se chamar de “ponteiro” uma váriável precedida por um operador de dereferenciação, representado por um asterísco (*).

Mas o que vem a ser uma “dereferenciação” ?

Trata-se da “retirada” (ou “remoção”) da referência, feita anteriormente, a uma variável. Portanto o “operador de dereferenciação”, i.e. ponteiro, “remove” a referência e com isto retorna o que há no local referenciado, ou seja, quando o ponteiro “dereferencia” uma variável, ele não faz mais do que retornar o conteúdo, até então armazenado no local exato daquela variável.

Entenda-se por “local exato” como sendo a “posição física” endereçada, i.e. numerada em ordem de posição, partindo da posição 0 (zero), sendo esta posição a “referência” inicial da memória ou como é vulgarmente conhecido, o “endereço” da célula de memória onde fica armazenado um byte de informação. Note que convencionou-se usar o byte como a menor unidade de armazenamento comportada por uma célula de memória ( 8 bits ), mas poderiam ser outros valores – em teoria qualquer valor de 1 a n bits.

Como achar a “referência” ou o “endereço” da variável ?

Usamos o “operador de referenciação”, que pode ser encarado como uma espécie de “anti-ponteiro” e que é representado por um ‘e‘ comercial  ( & ) .

Logo o endereço de uma variável ` i ‘, seria  &i  e possui, em computadores de 32 bits, 4 bytes de extensão, ou seja, uma “referência” ocupa no seu programa um mesmo “espaço”, i.e. quantidade de células de memória, que uma variável long.

Uma pequena demonstração:

#include <stdio.h>

int main(void)
{
  int i = 10;
  long l = (long) &i;

  printf("%d %ld %d %d\n", i, l, * (int *) l, * (& i));

  return 0;
}

A saída ficaria mais ou menos assim:

10 -3340376 10 10

No programa acima não crio um ponteiro formal ( o que seria feito declarando um int * l ), mas sim uma variável tipo long `l‘, para conter a referência a uma variável inteira, anteriormente declarada como `i‘.

Na sequência utilizo esta variável long, fazendo um “cast”, ou seja “maquiando” o tipo – para deixar o nosso compilador feliz – o que a faz ser reconhecida como um “ponteiro” para inteiro e, em seguida, “dereferencio” a variável `l‘ (aplicando o `*‘ na frente do seu nome), retornando para a função printf, o valor original de `i‘.

Note que não são usados ponteiros de facto, mas os operadores de referenciação (&) e dereferenciação (*) para ilustrar que “usar ponteiros” nada mais é do que dar um nome “chic” às operações de “dereferenciação” de uma variável, e que um “ponteiro” é apenas uma variável que contém um “endereço” de memória.

Anúncios

Um comentário sobre “Um detalhe sutil sobre os ponteiros

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s