29
1

Aula 4 -Ponteiros

Embed Size (px)

Citation preview

  • *

    *

  • Programao Estruturada IIProf. Eder [email protected]

    *

  • * Ponteiros Definio Variveis Ponteiros Aritmtica de Ponteiros Operadores Comparaao Matrizes

    *

  • *Motivao - PonteirosPonteiros: Fornecem os meios pelos quais as funes podem modificar seus argumentos.

    So usados para suportar as rotinas de alocao dinmica de C.

    Aumenta a eficincia de algumas rotinas.

    *

  • *Definio - PonteirosPonteiro: uma varivel que contm um endereo de memria.

    Esse endereo normalmente a posio de uma outra varivel de memria. Se uma varivel contm o endereo de uma outra, ento a primeira varivel dita para apontar para a segunda.

  • *Ponteirosmcount

    *

  • *Variveis PonteirosVarivel Ponteiro: Uma declarao de ponteiro consiste no tipo base, um * e o nome da varivel.

    A forma geral para declarar uma varivel ponteiro

    tipo *nome;Onde tipo qualquer tipo vlido em C e nome o nome da varivel ponteiro.

  • *Prtica - PonteirosAula 4 - Manipulando Variveis Ponteiros.cpp

    *

  • *Expresso com Ponteiros Aritmtica de Ponteiros:Existem cinco operaes bsicas que podem ser usadas com ponteiros Atribuio. Trazer o endereo do ponteiro. Encontra valores.Incrementar o ponteiro.Adio e Subtrao.

  • *Expresso com Ponteiros Atribuio de Ponteiros:Como em qualquer varivel, um ponteiro pode ser usado no lado direito de um comando de atribuio para passar seu valor para um outro ponteiro.Exemplo: Aula 4 - AtribuiodePonteiros.cpp

  • *Os operadores de PonteirosOperador &: Operador unrio que devolve o endereo da memria do seu operando.

    Operador *:Operador unrio que devolve o valor da varivel localizada no endereo que o segue ( endereo da varivel que foi atribuida ao ponteiro ).

  • *Os operadores de PonteirosAdio e Subtrao Podem ser usadas duas operaes aritmticas com ponteiros: Adio e Subtrao.Exemplo:Se p1 um ponteiro do tipo integer com o valor atual de 2000, aps a operao p1++, o ponteiro passar a ter o valor de 2002.Cada vez que ele for incrementado ele ir apontar para o prximo inteiro cada inteiro utiliza-se de 2 byte de memria.

  • *Os operadores de PonteirosAdio e Subtrao O mesmo verdade para decremento, aps a expresso p1--, o ponteiro ir receber o valor de 1998.Resumindo, cada vez que o ponteiro incrementado ele aponta a prxima posio de memria do seu tipo base, o mesmo vale para decremento.No existe uma limitao somente para incremento e decremento, pode-se somar ou subtrair inteiros de ponteiros.p1 = p1 + 12; o ponteiro p1 aponta para o dcimo segundo elemento do tipo p1 adiante.

  • *Os operadores de Ponteiros

    Cada varivel do tipo char utiliza-se de um byte, logo:Para cada incremento da varivel ch, incremeta-se o endereo em 1 byte ( 3000, 3001, 3002, etc ).

    Cada varivel do tipo integer utiliza-se de dois bytes, logo:

    Para cada incremento da varivel i, incrementa-se o endereo em 2 bytes( 3000, 3002, 3004, etc ).

  • *Prtica Operaes com ponteirosAula 4 - Operao com Ponteiros.cpp

    Aula 4 - Operacao com ponteiros_string.cpp

    *

  • *Comparao de PonteirosComparao: Teste relacionais com >=, e < so aceitos entre ponteiros somente quando os dois operandos so ponteiros.Outro ponto importante quanto ao tipo apontado pelos operandos. As duas variveis devem ser do mesmo tipo.Variveis ponteiros ainda podem ser testadas quanto igualdade ( == ) ou desigualdade ( !=).

  • *Comparao de PonteirosComparao:Um exemplo de comparao de dois ponteiros: Aula 4 - Comparando Ponteiros.c

    A comparao normalmente utilizada quando dois ou mais ponteiros apontam para o mesmo objeto em comum, por exemplo em uma pilha.

    *

  • *Ponteiros - Cuidados As variveis ponteiros devem sempre apontar para o tipo de dado correto.

    Por exemplo: No atribua a uma varivel ponteiro de um tipo inteiro o endereo de uma varivel do tipo float. O programa ir compilar sem nenhuma mensagem de erro. Alguns compiladores iro produzir uma mensagem de erro. No se pode multiplica ou dividir ponteiros.

  • *Matrizes Vetores e PonteirosExiste um estreita relao entre ponteiros e matrizes.O nome de uma matriz um endereo, ou seja, um ponteiro.A maneira como ambos acessam a memria identico.

    O programa abaixo demonstra isso:

    Aula 4 - Lendo uma matriz.c

  • *Matrizes Vetores e Ponteiros

    Matrizes:No caso do cdigo abaixo:char str[50], *p1;p1 = str;Ocorreu a inializao do ponteiro p1, com o primeiro endereo da matriz.Logo posso afirmar:*p1 = str[0], *(p1+1) = str[1], *(p1+2) = str[2] p1 = &str[0], (p1+1) = &str[1], (p1+2)=&str[2]

  • *Prtica Vetores como PonteirosAula 4 - Vetores com Ponteiros.cpp

    *

  • *Matrizes Vetores e Ponteiros

    Logo, conforme visto no exemplo anterior eu posso usar aritmtica de ponteiros para manipular um vetor, como por exemplo no exercicio abaixo:

    Aula 4 - Vetores com ponteiros_2.cpp

  • Exerccios1 Utilizando ponteiros Criar um algoritmo que leia nmeros inteiros e os armazene em vetor de 9 elementos. O aplicativo ir imprimir todos os elementos da matriz multiplicado por uma constante ( nmero inteiro ).Importante: Todos os laos de repetio devem ser trabalhados utilizando ponteiros.*

    *

  • *Exercicio1 Continuao: Deve ser criada uma funo para entrar com os nmeros na matriz e outra para escrever esses nmeros na matriz. No poder ser utilizado variveis globais. A entrada pode ser feita direto no aplicativo, no precisa pedir para o usurio.

    *

  • *Exerccios2 - Qual a saida desse programa

    int vet[]={5,6,8}, *p; p = vet; printf("%p %p %d %d \n",&vet, p,*p+2,*(p+1)); system("PAUSE");

    *

  • *Exerccios3 Encontre os erros nesses dois programas e comente o que estava errado, o que isso poderia causar e como deve ser resolvido.

    void main() /* esse programa esta errado */{int x, *p;x = 10;*p = x;}

    *

  • *Exerccios4 Encontre os erros nesses dois programas e comente o que estava errado, o que isso poderia causar e como deve ser resolvido.

    void main() /* esse programa esta errado */{int x, *p;x = 10;p = x;printf ("%d", *p);}

    *

  • *Exerccios No fazer5 - Faa um programa que leia um conjunto de valores digitados pelo usurio, armazene os valores positivos em uma pilha.Os valores negativos devero ser ignorados.-> Se o usurio digitar -2 o aplicativo ir finalizar.-> obrigatrio: A utilizao de funes[ pop(),push(),verificanumeronegativo()] A utilizao de ponteiros. A utilizao de aritmtica de ponteiros. No necessrio criar um projeto. Todo aplicativo pode estar em somente um arquivo.c

    *

  • *Sugesto de leitura para fixao do contedo da aula de hoje:Bibliogrfia Bsica:Livro Texto: Treinamento em Linguagem C.

    Bibliogrfica Complementar:Livro r: SCHILDT, H. C Completo e Total., So Paulo: Makron Books, 1997.

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *