Anda di halaman 1dari 7

Estrutura de Dados

Ponteiros Introduo
Antes de pensarmos em ponteiros, importante nos lembrarmos de alguns aspectos referentes variveis. Sabemos que variveis possuem nomes que as identificam durante a execuo do programa. Sabemos ainda que uma varivel armazena um valor (que pode ser fixo, no caso de uma constante, ou pode mudar durante a execuo de seus cdigos). Mas o mais importante a ser lembrado que uma varivel possui um endereo, e que o nome da varivel no nada mais que um apelido para a localizao deste endereo. Desta forma, um ponteiro no nada mais que um tipo especial de varivel que armazena o endereo de outra.

Ponteiros Introduo
Ponteiros so um dos recursos mais poderosos da linguagem C e de outras. Qualquer programa de utilidade prtica escrito em C dificilmente dispensar o uso de ponteiros. So muitas as aplicaes de ponteiros. A seguir, relao das mais comuns. Acessar endereos de memria que o programa aloca em tempo de execuo. Acessar variveis que no so visveis em uma funo. Manipulao de arrays. Manipulao de strings. Passar o endereo de uma funo para outra. Retornar mais de um valor para uma funo.

Ponteiros - Declarao
Como j vimos ponteiro uma varivel que contm o endereo de um objeto de dados, em geral uma outra varivel. Essa a razo para o seu nome: ele aponta para outra varivel. Conforme qualquer varivel em C, o ponteiro deve ser declarado antes de ser usado. Basta inserir o operador indireto (*) aps o tipo da varivel. int *ptr; //so ponteiros para o tipo int Essa declarao define a varivel ptr como um ponteiro para uma varivel do tipo int (nmero inteiro). A declarao de ponteiro no tem o mesmo significado da declarao de uma varivel. Ela indica apenas o tipo de objeto de dados apontado e, desde que contm endereo de memria, o tamanho em bytes que ocupa no tem relao com o tamanho do objeto apontado. O tamanho do ponteiro fixo e depende apenas do modelo de memria do sistema (2 bytes ou 4 bytes, normalmente).

Ponteiros - Declarao
Para declarar mais de um ponteiro por linha, usa-se um operador indireto (*) para cada char *ch1, *ch2; //(so ponteiros para o tipo char). Se um operador for omitido (exemplo: char *ch1, ch2;), a varivel correspondente no ser ponteiro e, certamente, provocar erro de execuo se usada como tal. O ponteiro pode ser declarado para qualquer tipo legal de varivel em C (char, int, float, double, etc), alm de void, que seria um genrico, podendo apontar para qualquer tipo de dado.

Ponteiros Inicializando e Atribuindo


Para entendermos melhor a atribuio de valores a ponteiros declarados necessrio saber que existem dois operadores unitrios que so utilizados com os ponteiros. O primeiro o operador (*) atravs dele possvel retornar o valor da varivel que est localizada no ponteiro. E o segundo o operador (&) que retorna o endereo de memria que est localizado o valor da varivel contida no ponteiro. Portanto para atribuirmos um valor para o ponteiro necessrio referenciar o valor da varivel que se encontra no ponteiro utilizando o operador (*), como ser demonstrado a seguir.

Ponteiros Inicializando e Atribuindo


A simples declarao de um ponteiro no o faz til. necessria a indicao da varivel para a qual ele aponta. int int var ptr var; *ptr; = 10; = &var;

Na seqncia acima, so declarados uma varivel 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.

Ponteiros Inicializando e Atribuindo


int var; int *ptr; var = 10; ptr = &var; *ptr = 15;

Na seqncia acima, na quinta linha estamos atribuindo o valor 15 para a varivel que est contida no ponteiro, ou seja, estamos alterando diretamente o valor da varivel var, diferentemente da quarta linha onde estamos passando o endereo da varivel var para prt. Observa-se o uso do operador de endereamento (&) na quarta linha para inicializao do ponteiro. Isso significa, no cdigo (ptr = &var;), que ptr passa a conter o endereo de var, no o seu valor.

Ponteiros Inicializando e Atribuindo

Supondo que o sistema endereado por 2 bytes, a Figura 01 acima d uma idia grfica dessa associao: o contedo de ptr 4052, que o endereo do primeiro byte da varivel var (ptr ocupa 2 bytes por causa do endereamento do sistema e var tambm ocupa 2 bytes, mas por ser do tipo int). O valor 4052 para a posio de memria de var apenas ilustrativo. Na prtica, depender do local de memria onde o programa foi carregado.

Ponteiros Inicializando e Atribuindo

Com ptr apontando para var, possvel realizar operaes com var de forma indireta, a partir de ptr. Exemplos a seguir. Acrescentando a linha int newVar = *ptr; Ao cdigo anterior, o valor de newVar 10, que o valor de var lido indiretamente atravs de ptr. E a linha *ptr = 20; Modifica o valor de var para 20, ou seja, altera de forma indireta atravs de ptr. importante lembrar que um ponteiro declarado e no inicializado poder ter contedo nulo ou aleatrio, a depender da alocao do sistema. Nessa condio, se o contedo apontado for modificado, algumas posies de memria tero seus valores indevidamente alterados e as conseqncias sero imprevisveis.

Ponteiros Exemplo

Ponteiros Exemplo
Veja o resultado do cdigo anterior abaixo:

Exerccios
1. Seja o seguinte trecho de programa: int i=3,j=5; int *p, *q; p = &i; q = &j; Qual o valor das seguintes expresses ? a) p == &i; b) *p - *q c) **&p d) 3* - *p/(*q)+7 Qual ser a sada deste programa supondo que i ocupa o endereo 4094 na memria? main() { int i=5, *p; p = &i; printf(%x %d %d %d %d \n, p,*p+2,**&p,3**p,**&p+4); } 3. Se i e j so variveis inteiras e p e q ponteiros para int, quais das seguintes expresses de atribuio so ilegais? a) p = &i; b) *q = &j; c) p = &*&i; d) i = (*&)j; e) i = *&j; f) i = *&*&j; g) q = *p; h) i = (*p)++ + *q 2.

Trabalho grupo de 2 alunos Exerccios 4. Faa um programa em c onde x = 3 e y = 5, multiplicar x por y sem utilizar as Variveis x e y e sim ponteiros.

Anda mungkin juga menyukai