Baixe o app para aproveitar ainda mais
Prévia do material em texto
Ponteiros Prof. Pedro Henrique V. de O. Azevedo pedro.hvo.azevedo@gmail.com sites.google.com/site/phvoazevedo Programac¸a˜o II 1 / 83 Histo´ria no Paı´s dos Telefones 2 / 83 Era uma vez... Um paı´s onde existia um telefone todas as casas, exceto as de pessoas que tinham problemas com a justic¸a. Como em qualquer paı´s, cada casa possuia um enderec¸o, que era utilizado como identificac¸a˜o da casa. Obviamente, cada enderec¸o e´ U´NICO, ou seja, na˜o existem dois enderec¸os iguais em todo o paı´s. Os habitantes desse paı´s se referenciam, sempre que possı´vel, a`s casas uns dos outros pelo nome da pessoa que la´ mora. 3 / 83 Era uma vez... Vamos supor que neste paı´s existiam treˆs amigos, Joa˜o, Ana e Pedro, que trocavam telefones entre si. Logo: Quando falamos de Joa˜o, Ana e Pedro falamos de seus respectivos telefones. 4 / 83 Voltando ao C... Quando declaramos treˆs varia´veis em C int x=4, y=5, z=7; Quando falamos de X, Y e Z falamos de seus respectivos valores declarados. 5 / 83 Voltando ao C... Imaginando que Telefone fosse um tipo da linguagem C, poderiamos definir suas varia´veis como Telefone Joa˜o=7894561, Ana=4567812, Pedro=3216598; E graficamente falando, terı´amos 6 / 83 Voltando ao C... Oras, ja´ trabalhamos com o nome e o valor desses nomes. Qual outra informac¸a˜o ainda na˜o estamos utilizando? O ENDEREC¸O Em C temos o operador & que permite saber qual o enderec¸o de uma varia´vel. 7 / 83 Voltando ao C... Oras, ja´ trabalhamos com o nome e o valor desses nomes. Qual outra informac¸a˜o ainda na˜o estamos utilizando? O ENDEREC¸O Em C temos o operador & que permite saber qual o enderec¸o de uma varia´vel. 7 / 83 Voltando ao C... Oras, ja´ trabalhamos com o nome e o valor desses nomes. Qual outra informac¸a˜o ainda na˜o estamos utilizando? O ENDEREC¸O Em C temos o operador & que permite saber qual o enderec¸o de uma varia´vel. 7 / 83 Voltando ao C... Se estive´ssemos programando em C terı´amos que 8 / 83 Voltando ao paı´s dos telefones... Lembrando que nem todas as pessoas no paı´s dos telefo- nes podiam ter telefone em casa. Era o caso de SAMAD, acusado de corrupc¸a˜o de desvio de milho˜es de gigabytes. SAMAD na˜o pode ser preso por falta de provas concretas mas perdeu o direito de possuir um telefone em casa. De uns tempos pra ca´, SAMAD esta´ muito mal de sau´de e sem telefone na˜o tem como ligar para uma emergeˆncia. A justic¸a concedeu a SAMAD um local ONDE podera´ reali- zar as ligac¸o˜es, a casa de Joa˜o. Logo, SAMAD na˜o possuira´ um telefone em casa, e sim um local (a casa de Joa˜o) onde podera´ fazer ligac¸o˜es. 9 / 83 Voltando ao paı´s dos telefones... 10 / 83 Voltando ao C... As outras pessoas podiam ser declaradas como Telefone Joa˜o=7894561, Ana=4567812, Pedro=3216598; Pore´m, SAMAD tem uma particularidade pois ele ira´ apon- tar para a casa onde ele podera´ realizar a ligac¸a˜o Telefone *SAMAD; Telefone SAMAD = &Joa˜o; Em C, o sı´mbolo * indica uma varia´vel que ira´ apontar para o enderec¸o de uma outra varia´vel de mesmo tipo. 11 / 83 Voltando ao C... Vamos observar os valores das varia´veis declaradas Podemos observar que falar de SAMAD e´ o mesmo que falar de &Joa˜o, pois a varia´vel SAMAD conte´m o valor do enderec¸o de Joa˜o. Logo, se uma varia´vel X conte´m o enderec¸o de uma varia´vel Y, conseguimos acessar o valor de Y a partir de X colocando um asterı´sco antes da varia´vel X (*X). 12 / 83 Voltando ao C... Sendo assim, podemos completar a tabela anterior da se- guinte forma: 13 / 83 Voltando ao paı´s dos telefones e ao C ao mesmo tempo... Joa˜o deu falta de alguns itens em sua casa apo´s as idas de SAMAD a` sua casa para realizar ligac¸o˜es para a emergeˆncia. Joa˜o entrou na justic¸a contra SAMAD e a justic¸a transferiu o apontamento de SAMAD para Ana. Telefone SAMAD = ???; 14 / 83 Voltando ao paı´s dos telefones e ao C ao mesmo tempo... Joa˜o deu falta de alguns itens em sua casa apo´s as idas de SAMAD a` sua casa para realizar ligac¸o˜es para a emergeˆncia. Joa˜o entrou na justic¸a contra SAMAD e a justic¸a transferiu o apontamento de SAMAD para Ana. Telefone SAMAD = &Ana; Quais valores esta˜o contidos em: Ana &Ana SAMAD &SAMAD *SAMAD 15 / 83 A Memo´ria do Computador Como sabemos, tudo do computador se passa em memo´ria. La´ sa˜o carregados nossos programas, jogos e tambe´m as varia´veis de nosso programa Assim como os enderec¸os de Joa˜o, Pedro e Ana, cada posic¸a˜o na memo´ria possui um enderec¸o u´nico represen- tado por um nu´mero. 16 / 83 A Memo´ria do Computador Sempre que declaramos uma varia´vel, indicamos seu tipo, seu nome e precisamos de alguma forma atribuir um valor para aquela varia´vel. char ch = ’A’; char *ptr; ptr = &ch; A varia´vel ch ocupa o espac¸o 5000, conte´m como conteu´do a letra A e o ponteiro ptr aponta para o enderec¸o de memo´ria de ch. 17 / 83 A Memo´ria do Computador Sendo assim, qual o valor de: ch &ch ptr &ptr *ptr 18 / 83 Ta´, e daı´? Por que usar ponteiros? Permite que a func¸a˜o modifique os paraˆmetros recebidos; Manipulac¸a˜o mais fa´cil de elementos de um vetor; Alocac¸a˜o e desalocac¸a˜o de memo´ria; Criac¸a˜o de estruturas de dados mais complexas; A diferenc¸a entre homens e meninos na programac¸a˜o esta´ certamente do qua˜o bem ele manipula ponteiros. 19 / 83 Encabec¸ando no C Declarac¸a˜o de ponteiros Lembrando que o sı´mbolo * indica uma varia´vel que ira´ apontar para o enderec¸o de uma outra varia´vel de mesmo tipo. 20 / 83 Encabec¸ando no C Operadores & e * 21 / 83 Encabec¸ando no C Cuidado com ponteiros Qual a saı´da do co´digo a seguir? 22 / 83 Encabec¸ando no C Ponteiro: NULL 23 / 83 Encabec¸ando no C Operac¸o˜es com Ponteiros 24 / 83 Encabec¸ando no C Operac¸o˜es com Ponteiros 25 / 83 Encabec¸ando no C Ponteiros e Vetores 26 / 83 Encabec¸ando no C Ponteiros e Vetores 27 / 83 Encabec¸ando no C 28 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica de Memo´ria 29 / 83 Encabec¸ando no C Problema 30 / 83 Encabec¸ando no C Problema 31 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica de Memo´ria 32 / 83 Encabec¸ando no C Func¸o˜es de Alocac¸a˜o Dinaˆmica 33 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: sizeof() 34 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: malloc() 35 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: malloc() 36 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: malloc() 37 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: malloc() 38 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: calloc() 39 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: calloc() 40 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: realloc() 41 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: realloc() 42 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: realloc() 43 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: free() 44 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: free() 45 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: free() 46 / 83 Encabec¸ando no C Alocac¸a˜o Dinaˆmica: free() 47 / 83 Encabec¸ando no C Exercı´cios 48 / 83 Encabec¸ando no C Exercı´cios 49 / 83 Func¸o˜es e Ponteiros 50 / 83 Passagem por Valor 51 / 83 Passagem por Valor 52 / 83 Passagem por Valor 53 / 83 Passagem por Refereˆncia 54 / 83 Passagem por Refereˆncia 55 / 83 Passagem por Refereˆncia 56 / 83 Ainda na˜o me convenceu... 57 / 83Ainda na˜o me convenceu... 58 / 83 Exercı´cios Utilizando func¸o˜es com ponteiros, vamos trocar os valores de X e Y. 59 / 83 Vetores e Refereˆncia 60 / 83 Vetores e Refereˆncia 61 / 83 Vetores e Refereˆncia Exemplo: Retorno de vetor ponteiro (func¸a˜o CriaVetor). 62 / 83 Matrizes e Refereˆncia 63 / 83 Matrizes e Refereˆncia Exemplo: Retorno de matriz ponteiro (func¸a˜o CriaMatriz). 64 / 83 Func¸o˜es e Struct 65 / 83 Func¸o˜es e Struct 66 / 83 Func¸o˜es e Struct 67 / 83 Func¸o˜es e Struct Exemplo: 68 / 83 Func¸o˜es e Struct 69 / 83 Func¸o˜es e Struct 70 / 83 Func¸o˜es e Struct Exemplo: 71 / 83 Func¸o˜es e Struct 72 / 83 Func¸o˜es e Struct Exemplo: 73 / 83 Recursividade 74 / 83 Recursividade 75 / 83 Recursividade 76 / 83 Recursividade 77 / 83 Recursividade 78 / 83 Recursividade 79 / 83 Recursividade 80 / 83 Recursividade 81 / 83 Recursividade 82 / 83 Recursividade 83 / 83 Ponteiros
Compartilhar