Você está na página 1de 5

Algoritmos e Estrutura de Dados Material de Apoio Professor Rodrigo Stein

Ponteiros
Da mesma maneira que existem em C variveis do tipo char, int e float, existem variveis do tipo ponteiro. As variveis do tipo ponteiro armazenam endereos de memria e so utilizadas por 3 razes especficas na programao: permitem a modificao de argumentos de funes: permitem que uma funo altere valores de variveis no globais e no locais a ela atravs da referncia ao endereo de memria da varivel passada como parmetro para a funo; permitem o uso de rotinas de alocao dinmica de memria: alocao e desalocao de memria em tempo de execuo conforme a necessidade do programa; aumento de eficincia em determinadas rotinas. A forma de declarao de uma varivel ponteiro : tipo *nome_varivel onde tipo o tipo de varivel apontada pela varivel ponteiro. Por exemplo: float *p; // p um ponteiro de float Ou seja, p apontar para uma regio de memria que armazena um valor float.

Operadores para Ponteiros


Existem dois operadores especiais para trabalhar com ponteiros. So eles: * - contedo do endereo apontado por & - endereo de ATENO: Quando * usado na declarao de uma varivel ponteiro ele simplesmente indica que a varivel do tipo ponteiro de um tipo. O significado de * descrito acima no serve para declarao de ponteiros! Observe o exemplo abaixo: 1 2 3 4 5 6 7 8 main( ) { int v1, v2, * p, * q v1 = 3; v2 = 12; p = &v1; // p recebe o endereo de memria da varivel v1 q = p; // copia o endereo guardado em p para q *q = 44; // altera o valor armazenado no endereo apontado por q }

Neste exemplo, p e q so variveis do tipo ponteiro de inteiro. Na linha 6 feita uma atribuio varivel q, que passa a ter o mesmo valor armazenado em p: o endereo de v1. Ao modificarmos o contedo apontado por q na linha 7, alteraremos o valor guardado em v1, visto que a varivel q aponta para v1.

Algoritmos e Estrutura de Dados Material de Apoio Professor Rodrigo Stein

Exerccios
1) O que um ponteiro ? E para que serve um ponteiro ? 2) Qual da Seguinte instruo abaixo so corretas para declarar um ponteiro? A. Int _ptr x; B. Int *ptr; C. *int ptr; D. *x; 3) Na expresso float *pont , o que do tipo float / A. A varivel pont B. O endereo de pont C. A varivel apontada por pont D. Nenhuma alternativa 4) Assumindo que o endereo de num foi atribudo a um ponteiro pnum, quais das seguintes expresses so verdadeiras? (pode assinalar mais de uma se houver) A. Num == &pnum B. Num == *pnum C. Pnum == *num D. Pnum == &num 5) Qual a instruo que deve ser adicionada ao programa seguinte para que ele trabalhe corretamente ? Main() { Int j, *ppj; _____________ *pj = 3; } 6) Assumindo que o endereo da varivel x foi atribudo a um ponteiro px, escreva uma expresso que no usa x, e divida x por 5; Qual o valor das seguintes expresses: Int i=3, j=5; Int *p=&i; Int *q= &j; A. P == &i ; B. *p-*q; C. **&p; 7) Qual ser a sada deste programa? Main() { Int i=5, *p=&i; Printf(%u %d %d %d %d \n, p, *p+2, **&p, 3**p, **&p+4); }

Algoritmos e Estrutura de Dados Material de Apoio Professor Rodrigo Stein

8) Seja a seguinte sequncia de Instrues em c: Int *pti; Int i=10; Pti=&i; Qual afirmativa falsa? A. B. C. D. E. Pti armazena endereo de i *pti igual a 10 Ao se executar *pti=20; i passara a ter o valor de 20 Ao se alterar o valor de i, *pti ser modificado Pti igual a 10

9) Considerando as variveis e ponteiros definidos abaixo, quais so as atribuies permitidas? Int x, *ptx, **pp; Float a, *pta, **pf; A. B. C. D. E. F. G. H. I. J. X=100; *pta=&a; Ptx=&a; *pf = &a; Pp=&pta; **pf=7.9; *ptx=20; Ptx=&x; Pp=&x; Pf=&pta;

10) ) Considerando as variveis e ponteiros definidos abaixo, quais so as atribuies permitidas? Int i, *pi, **ppi; / Float f, *pf, **ppf; A. B. C. D. E. F. G. H. I. J. I=f; Pf=&i; *pf=5.9; *ppi=π *pf=10; F=i; Pi=&f; *pi=7.3; Ppf=&pf; **ppi=100;

11) Dadas as declaraes abaixo, qual o valor dos itens: Int x=10, *px=&x, **ppx=&x; / Float y=5.9, *py=&y, **ppy=&py; X=FFA0 / Y=FFB4 / PX=FFF0 / PY=FC6 / PPY=FFA6 / PPX=FFD4 (MEMORIA) A. B. C. D. E. X= Py= Px = &y = *px =

Algoritmos e Estrutura de Dados Material de Apoio Professor Rodrigo Stein

F. G. H. I. J. K. L. M. N. O. P. Q.

Y= *ppx = Py = &x = Py++= *px--= **ppy= &ppy = *&px= **ppx++; Px++= &ppx=

O que uma estrutura? um conjunto de variveis dentro de um mesmo nome. Em geral, uma varivel de um tipo especfico, por exemplo, temos uma varivel do tipo inteira e estamos fechados a nos referenciar aquele nome que lhe foi dado sempre por um nmero do tipo inteiro, logicamente. J as estruturas, dentro de um mesmo nome podemos nos referenciar a uma gama de variveis pr-definidas. Declarao Podemos criar definies de estruturas, nas quais podemos utiliz-las como "molde" (tipo) para futura utilizao. Existe uma ligao lgica entre os elementos de uma estrutura. Podemos exemplificar com uma estrutura que contenha nome, telefone e saldo na conta corrente. struct molde_conta { char nome[50];int telefone;float saldo ; }; Bem, declaramos o tipo de dado, o molde para utilizao no futuro. Repare que a linha foi terminada com ponto e vrgula, como em um comando comum. Definido o molde, devemos agora declarar a varivel que utilizar desse molde. struct molde_conta conta; Agora sim, temos a varivel conta com a definio declarada em molde_conta. Uma outra opo a declarao direta, por exemplo, j na definio do molde, declaramos as variveis de forma embutida. Assim: struct molde_conta { char nome[50]; int telefone; float saldo; } conta, conta2; Continuamos com o molde chamado molde_conta e alm disso declaramos o conta e conta2 como esse tipo, o equivalente a: struct molde_conta conta conta2;

Algoritmos e Estrutura de Dados Material de Apoio Professor Rodrigo Stein

Na memria, as variveis dentro da struct so seqenciais, o nome da struct s o endereo da primeira posio de memria de tal struct, os elementos so as posies exatos do endereo de memria. Espero que todos estejam entendendo, essas definies de memria, posio e tal so altamente ligado aos conceitos de ponteiros. Podemos tambm declarar apenas a varivel do tipo struct, sem necessidade do seu molde. Teramos ento: struct { char nome[50]; int telefone;float saldo;} conta; Assim, temos a varivel conta, exatamente igual ao exemplo anterior. Isso til para quando no precisarmos de mais de uma vez, tal varivel. Utilizao do tipo Utilizamos um operador, chamado de operador ponto, para nos referenciar a struct. No exemplo acima, caso queiramos botar um valor no telefone, utilizamos: conta.telefone = 10; Sempre assim, nome_da_estrutura.nome_da_varivel, e assim a utilizamos como uma varivel comum, com exceo da especificao do nome da estrutura. Atravs desse tipo de referenciao, se faz o clculo automtico da posio de memria do elemento. Para uma string, podemos: strcpy(conta.nome,"meunomeentraaqui"); Para contar o nmero de caracteres de nome dentro da estrutura conta, podemos fazer: for (i=0,conta.nome[i],++i) ; printf ("o nome tem -> %d letras \n",i); A utilizao idntica. Muito fcil no? Podemos fazer atribuio de structs, do tipo conta2 = conta, e os valores sero idnticos. Um tipo bem utilizado em programao, so as matrizes de structs. Podemos pensar que um banco, precisa de um conjunto desse tipo de structs, claro que de forma muito mais complexa, para referenciar-se aos seus clientes. Teramos ento: struct molde_conta conta[100]; Agora teremos um vetor do molde_conta (lembre-se da definio de molde l do comeo), cada um idntico que o conta tradicionalmente declarado l em cima, com exceo de seu identificador de posio.