Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos e Estrutura de Dados Material de Apoio Ponteiros 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. A forma de declaração de uma variável ponteiro é: tipo *nome_variável 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. Operadores para Ponteiros Existem dois operadores especiais para trabalhar com ponteiros. São eles: * - conteúdo do endereço apontado por & - endereço de ATENÇÃO: Quando * é usado na declaração de uma variável ponteiro ele simplesmente indica que a variável é do tipo ponteiro de um tipo. O significado de * descrito acima não serve para declaração de ponteiros! Observe o exemplo abaixo: 1 main( ) { 2 int v1, v2, * p, * q 3 v1 = 3; 4 v2 = 12; 5 p = &v1; // p recebe o endereço de memória da variável v1 6 q = p; // copia o endereço guardado em p para q 7 *q = 44; // altera o valor armazenado no endereço apontado por q 8 } Neste exemplo, p e q são variáveis do tipo ponteiro de inteiro. Na linha 6 é feita uma atribuição à variável q, que passa a ter o mesmo valor armazenado em p: o endereço de v1. Ao modificarmos o conteúdo apontado por q na linha 7, alteraremos o valor guardado em v1, visto que a variável q aponta para v1. Exercícios 1) O que é um ponteiro ? E para que serve um ponteiro ? 2) Qual da Seguinte instrução abaixo são corretas para declarar um ponteiro? Int _ptr x; Int *ptr; *int ptr; *x; 3) Na expressão float *pont , o que é do tipo float / A variável pont O endereço de pont A variável apontada por pont Nenhuma alternativa 4) Assumindo que o endereço de num foi atribuído a um ponteiro pnum, quais das seguintes expressões são verdadeiras? (pode assinalar mais de uma se houver) Num == &pnum Num == *pnum Pnum == *num Pnum == &num 5) Qual é a instrução que deve ser adicionada ao programa seguinte para que ele trabalhe corretamente ? Main() { Int j, *ppj; _____________ *pj = 3; } 6) Assumindo que o endereço da variável x foi atribuído a um ponteiro px, escreva uma expressão que não usa x, e divida x por 5; Qual o valor das seguintes expressões: Int i=3, j=5; Int *p=&i; Int *q= &j; P == &i ; *p-*q; **&p; 7) Qual será a saída deste programa? Main() { Int i=5, *p=&i; Printf(“%u %d %d %d %d \n”, p, *p+2, **&p, 3**p, **&p+4); } 8) Seja a seguinte sequência de Instruções em c: Int *pti; Int i=10; Pti=&i; Qual afirmativa é falsa? Pti armazena endereço 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 variáveis e ponteiros definidos abaixo, quais são as atribuições permitidas? Int x, *ptx, **pp; Float a, *pta, **pf; X=100; *pta=&a; Ptx=&a; *pf = &a; Pp=&pta; **pf=7.9; *ptx=20; Ptx=&x; Pp=&x; Pf=&pta; 10) Considerando as variáveis e ponteiros definidos abaixo, quais são as atribuições permitidas? Int i, *pi, **ppi; Float f, *pf, **ppf; I=f; Pf=&i; *pf=5.9; *ppi=π *pf=10; F=i; Pi=&f; *pi=7.3; Ppf=&pf; **ppi=100; 11) Dadas as declarações 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) X= Py= Px = &y = *px = Y = *ppx = Py = &x = Py++= *px--= **ppy= &ppy = *&px= **ppx++; Px++= &ppx=
Compartilhar