algoritmos e estrutura de dados i revisão - ponteiros prof.: ricardo argenton ramos

Download Algoritmos e Estrutura de Dados I Revisão - Ponteiros Prof.: Ricardo Argenton Ramos

Post on 17-Apr-2015

104 views

Category:

Documents

1 download

Embed Size (px)

TRANSCRIPT

  • Slide 1
  • Algoritmos e Estrutura de Dados I Reviso - Ponteiros Prof.: Ricardo Argenton Ramos
  • Slide 2
  • Roteiro Definio de Ponteiros; Passagem de Argumentos por Valor e Referncia; Retornando Dados de Funes; Operadores - Direto (&) e Indireto (*); Operaes com Ponteiros.
  • Slide 3
  • Introduo Trs razes para o uso de ponteiros: Funes podem modificar seus argumentos; Alocao dinmica de memria Aumentar a eficincia de algumas rotinas Cuidado ao utiliz-los Ponteiros no inicializados Erro do Windows
  • Slide 4
  • Ponteiros Um Ponteiro uma varivel que contm o endereo de memria de outra varivel. possvel ter um ponteiro para qualquer tipo de varivel.
  • Slide 5
  • Passagem por Valor Em C todos os argumentos (parmetros) de funes so passados por valor Isso significa que uma cpia dos valores dos argumentos dada funo chamada, e ela cria outras variveis temporrias para armazenar esses valores O ponto principal que, em C, uma funo chamada no pode alterar o valor de uma varivel da funo que chama; ela s pode alterar a sua cpia temporria.
  • Slide 6
  • Passagem de Argumentos por Valor main(){ int a, b; a = 5; b = 5; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); incrementa(a,b); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } Cria duas variveis a e b que sero utilizadas como parmetro da funo Incrementa(). Imprime o valor e o endereo das variveis a e b antes e aps chamar a funo. Invoca a funo para incrementar os valores de a e b
  • Slide 7
  • int incrementa(int a, int b){ a = a + 2; b = b + 2; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } Cria duas novas variveis a e b, incrementa elas em 2 unidades e imprime seus valores e endereos.
  • Slide 8
  • Passagem de Argumentos por Valor main(){ int a, b; a = 5; b = 5; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); incrementa(a,b); printf ("--- Depois de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } int incrementa(int a, int b){ a = a + 2; b = b + 2; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } a b
  • Slide 9
  • Passagem de Argumentos por Valor main(){ int a, b; a = 5; b = 5; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); incrementa(a,b); printf ("--- Depois de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } int incrementa(int a, int b){ a = a + 2; b = b + 2; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } a b 5 5
  • Slide 10
  • Passagem de Argumentos por Valor main(){ int a, b; a = 5; b = 5; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); incrementa(a,b); printf ("--- Depois de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } int incrementa(int a, int b){ a = a + 2; b = b + 2; printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); } a b 5 5 Dois valores inteiros so passados para a funo, mas ela no sabe quem so (onde esto) essas variveis. Nesse momento ela cria duas variveis para armazenar os valores inteiros que foram recebidos a b 5 5 7 7
  • Slide 11
  • Executando....
  • Slide 12
  • O que so Ponteiros ? Proporciona um modo de acesso a variveis sem referenci-las diretamente. O mecanismo usado para isso o endereo da varivel. Esse endereo age com um intermedirio entre a varivel e o programa que a acessa Basicamente, um ponteiro uma representao simblica de um endereo So usados onde a passagem de valores difcil ou indesejvel
  • Slide 13
  • Ponteiros Variveis Um ponteiro varivel possui como contedo um endereo de memria. Esse endereo a localizao de uma outra varivel de memria Diz-se que uma varivel aponta para outra quando a primeira possui o endereo da segunda Luiza 1 1 2 3 4 5 endereos
  • Slide 14
  • Ponteiros Constantes Ponteiros variveis so variveis que armazenam endereos de memria Ponteiros constantes so endereos de memria O nome de uma matriz um exemplo de um ponteiro constante
  • Slide 15
  • Razes para usar ponteiros Deseja modificar os argumentos que recebem Para criar estruturas de dados complexas, como listas encadeadas e rvores binrias Compilam mais rapidamente, tornando o cdigo mais eficiente
  • Slide 16
  • Retornando dados de Funes O primeiro exemplo mostrar como que uma funo pode alterar os valores dos argumentos da funo chamadora Vamos iniciar com uma nova verso do programa mostrado anteriormente.
  • Slide 17
  • Exemplo de ponteiros main() { int a, b; a = 5; b = 5; printf ("--- Antes de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); incrementa(&a,&b); printf ("--- Depois de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n\n\n", b, &b); } incrementa(int *a, int *b) { *a = *a + 2; *b = *b + 2; printf("\n--- Dentro da funcao ---"); printf("\n\n O Valor do ponteiro a: %d, seu endereco e: %d, e conteudo de a:%d \n", a, &a, *a); printf("\n\n O Valor do ponteiro b: %d, seu endereco e: %d, e conteudo de b:%d \n", b, &b, *b); Cria duas variveis a e b, atribui o valor 5 a cada uma delas, imprime o valor e endereo de cada uma. Chama a funo incrementa passando como parmetro o endereo de memria das variveis a e b. A funo incrementa() possui como parmetro dois ponteiros para os endereos de memria que receber como parmetro. Qualquer operao com esses ponteiros afetar o valor das variveis correspondentes.
  • Slide 18
  • Exemplo de ponteiros main() { int a, b; a = 5; b = 5; printf ("--- Antes de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n", b, &b); incrementa(&a,&b); printf ("--- Depois de chamar a funcao ---\n"); printf("\n O Valor de a: %d, e o seu endereco e: %d\n", a, &a); printf("\n O Valor de b: %d, e o seu endereco e: %d\n\n\n", b, &b); } incrementa(int *a, int *b) { *a = *a + 2; *b = *b + 2; printf("\n--- Dentro da funcao ---"); printf("\n\n O Valor do ponteiro a: %d, seu endereco e: %d, e conteudo de a:%d \n", a, &a, *a); printf("\n\n O Valor do ponteiro b: %d, seu endereco e: %d, e conteudo de b:%d \n", b, &b, *b); } a b 5 5 1 2 3 4 5 6 Na chamada da funo, ela cria duas variveis do tipo ponteiro que armazenaro endereos do tipo inteiro. As operaes sero realizadas sobre esses endereos. *a *b 1 2 7 7
  • Slide 19
  • Executando...
  • Slide 20
  • Pontos Importantes incrementa(&a,&b); incrementa(int *a, int *b) { *a = *a + 2; *b = *b + 2; printf("\n\n O Valor do ponteiro a: %d, seu endereco e: %d, e conteudo de a:%d \n", a, &a, *a); Funo chamada, passando para ela dois endereos de variveis Os endereos recebidos sero armazenados em variveis ponteiros. O contedo da varivel apontada recebe ele mesmo acrescido de 2. O valor do ponteiro a O endereo do ponteiro &a O valor da varivel apontada pelo ponteiro *a
  • Slide 21
  • Exerccio Elaborar um programa que faa a atribuio de novos valores a duas variveis (do tipo int) por referncia sem utilizar uma funo.
  • Slide 22
  • Outro Exemplo O prximo exemplo difere do primeiro no sentido de que as variveis do main() no possuem valores at que a funo altera2() chamada. A nica coisa que essa funo faz fornecer valores s variveis criadas no main()
  • Slide 23
  • Devolve2.c main() { int x,y; altera2(&x,&y); printf("\nO primeiro e %d, o segundo e %d\n\.", x,y); } altera2(int *px, int *py) { *px = 3; *py = 5; } Cria duas variveis e no atribui valor elas. Chama a funo altera2() passando os endereos dessas variveis. A funo cria variveis do tipo ponteiro que apontaro para os endereos que sero recebidos por parmetro. Qualquer operao com esses ponteiros afetar o valor das variveis apontadas.
  • Slide 24
  • Executando...
  • Slide 25
  • Operador e Operando Exemplo a++ operador ++, operando a a b operador -, operandos a e b &a operador & e operando a *p operador * e operando p
  • Slide 26
  • Operadores - Direto (&) e Indireto (*) Para declarar variveis do tipo Ponteiro int *px, *py; Isso cria duas variveis do tipo ponteiro. Essas variveis podem conter endereos de variveis do tipo int. Operadores & - operador direto que retorna o endereo da varivel operando * - operador indireto que retorna o

Recommended

View more >