PONTEIROS
Os
conceitos de endereço e ponteiro são fundamentais em qualquer linguagem de
programação (embora sejam mais visíveis em C que em outras linguagens). O
conceito de ponteiro é muito útil mas difícil; seu domínio exige um certo
esforço.
Da
mesma maneira que existem em C variáveis do tipo char, int e float, existem
variáveis do tipo ponteiro. As variáveis do tipo ponteiro armazenam endereços
de memória e são utilizadas por 3 razões específicas na programação:
· permitem
a modificação de argumentos de funções: permitem que uma função altere valores
de variáveis não globais e não locais a ela através da referência ao endereço
de memória da variável passada como parâmetro para a função;
· permitem
o uso de rotinas de alocação dinâmica de memória: alocação e desalocação de
memória em tempo de execução conforme a necessidade do programa;
· aumento
de eficiência em determinadas rotinas.
O
ponteiro nada mais é do que uma variável que guarda o endereço de uma outra
variável. A forma de declaração de uma variável ponteiro é:
tipo
*nome_variável //tipo = char, int ou
float
onde tipo é
o tipo de variável apontada pela variável ponteiro.
Por
exemplo:
float
*p; // p é um ponteiro de float
Ou
seja, p apontará para uma região de memória que armazena um valor float.
A
declaração de ponteiro não tem o mesmo significado da declaração de uma
variável. Ela indica apenas o tipo de objeto de dados apontado e, desde que
contém endereço de memória, o tamanho em bytes que ocupa não tem relação com o
tamanho do objeto apontado. O tamanho do ponteiro é fixo e depende apenas do
modelo de memória do sistema (2 bytes ou 4 bytes, normalmente).
Para
declarar mais de um ponteiro por linha, usa-se um operador indireto (*) para cada
char *ch1, *ch2; (são ponteiros para o tipo char).
Se um
operador for omitido (exemplo: char *ch1,
ch2;), a variável correspondente não será ponteiro e, certamente,
provocará erro de execução se usada como tal.
O
ponteiro pode ser declarado para qualquer tipo legal de variável em C (char, int, float, double, etc),
além de void, que seria um genérico, podendo apontar para
qualquer tipo de dado.
INICIALIZANDO
UM PONTEIRO
A
simples declaração de um ponteiro não o faz útil. É necessária a indicação da
variável para a qual ele aponta.
int var;
int
*ptr;
var =
10;
ptr =
&var;
Na
seqüência acima, são declarados uma variável tipo int (var) e um
ponteiro para o mesmo tipo (ptr). A terceira linha atribui o valor 10
a var e a última linha inicializa o ponteiro ptr.
Observa-se o uso do operador de endereçamento (&) para inicialização do ponteiro. Isso significa, no código ptr = &var;, que ptr passa a conter o endereço de var, não o seu valor.
Supondo
que o sistema é endereçado por 2 bytes, a Figura 01 acima dá uma idéia gráfica
dessa associação: o conteúdo de ptr é 4052, que é o endereço do
primeiro byte da variável var (ptr ocupa 2 bytes por causa do
endereçamento do sistema e var também ocupa 2 bytes, mas por ser do
tipo int).
O valor
4052 para a posição de memória de var é apenas ilustrativo. Na
prática, dependerá do local de memória onde o programa foi carregado.
Com ptr apontando
para var, é possível realizar operações com esta última de forma indireta,
a partir de ptr. Exemplos a seguir.
Acrescentando
a linha:
int
newVar = *ptr;
ao
código anterior, o valor de newVar é 10, que é o valor
de var lido indiretamente através de ptr.
E a
linha:
*ptr =
20;
modifica
o valor de var para 20, ou seja, altera de forma indireta através
de ptr.
É
importante lembrar que um ponteiro declarado e não inicializado poderá ter
conteúdo nulo ou aleatório, a depender da alocação sistema. Nessa condição, se
o conteúdo apontado for modificado, algumas posições de memória terão seus
valores indevidamente alterados e as consequências serão imprevisíveis.
CONCLUSÃO
Um
ponteiro é uma variável que guarda um endereço de uma outra variável. Sabemos
como declara-las e que antes de utiliza-las é necessário atribuir um endereço
válido. Podemos utilizar ponteiros para ponteiros. O uso de ponteiro é
importante em muitos casos e que se deve tomar muito cuidado ao usa-los.

Nenhum comentário:
Postar um comentário