Baixe o app para aproveitar ainda mais
Prévia do material em texto
Estrutura de Dados Ponteiros e Alocação Dinâmica Introdução ● As linguagens de programação permitem armazenar dados em variáveis que correspondem a endereços de memória onde determinado dado é armazenado temporariamente. ● Uma variável pode armazenar o endereço de memória de outra variável, atuando com uma referência ao conteúdo da outra. ● A esse conceito chamamos de : PONTEIRO Ponteiros ● Um Ponteiro é o endereço de memória de uma variável qualquer. ● Uma variável do tipo ponteiro guarda apenas o ponteiro (endereço) de seu tipo especificado. ● Operadores de ponteiros: & - (ê comercial) * - (asterisco) Operadores de acesso ao endereço de memória. Ponteiros ● Variável do tipo ponteiro: ● variável que armazena o endereço de memória de outra variável. ● "Aponta para ..." ● Operadores unários de ponteiros: ● "&" : retorna o endereço de memória de uma variável ● "*" : define uma variável do tipo ponteiro. : representa o conteúdo da variável que está apontando. : ex: int x = 5; int* ptr = &x; // atribui o 'endereço de' x à variável ptr. *ptr -> representa o conteúdo da variável x. (mesmo que x). ptr -> representa o endereço de memória da variável x. Operador & ● É um operador unário que retorna o endereço de memória de seu operando. ● Significa “o endereço de” Operador & Memória 5 ... ... 0x22ff45 0x22ff46 0x22ff47 0x22ff44 x &x Operador * ● É um operador unário que devolve o valor da variável localizada no endereço que o segue. ● retorna o endereço de memória de seu operando. ● Operador de complemento de &. ● Significa “valor no endereço de”. Sintaxe de declaração de uma variável ponteiro: Onde <tipo de dado> se refere ao tipo base. *<nome do identificador> é a variável ponteiro. <tipo de dado> *<nome do identificador>; Operador * Memória 5 ... ... 0x22ff45 0x22ff46 0x22ff47 0x22ff44 x &x 0x22ff440x22ff63 0x22ff64 0x22ff65 0x22ff62 p ...&p *p Representação da memória Exemplo ilustrando o desenho da página anterior Exemplo – Ponteiro com Tipo primitivo Exemplo – Ponteiro com Tipo primitivo Exemplo – Ponteiro com Tipo String Funções de alocação dinâmica ● As declarações de variáveis abaixo alocam memória para diversas variáveis. char c; int i; int v[10]; ● Essa alocação é estática, pois acontece antes que o programa comece a ser executado. ● Existem situações em que a quantidade de memória a alocar só se torna conhecida durante a execução da aplicação. ● Para realizar a alocação de memória nessas situações é preciso recorrer à alocação dinâmica de memória. Funções de alocação dinâmica ● Funções para gerenciamento de memória ● malloc ● free ● Função malloc( ) ● Permite alocar x bytes de memória. ● O endereço devolvido por malloc é do tipo "genérico" void *. O programador armazena esse endereço num ponteiro de tipo apropriado. char * ptr; ptr = (char*) malloc(1); char * ptr; ptr = malloc(1); Funções de alocação dinâmica ● operador sizeof ● é um operador de memória que permite informar quantos bytes de um tipo especificado de dado devem ser reservados. ● não é uma função. char* ptr; int qtdBytes = 1; ptr = (char*) malloc(qtdBytes * sizeof (char)); Funções de alocação dinâmica ● Limitação da alocação dinâmica ● Se a memória do computador já estiver toda ocupada, malloc não consegue alocar mais espaço. ● A função devolve NULL. ● Convém verificar essa possibilidade antes de prosseguir: char* ptr; int qtdBytes = 1; ptr = (char*) malloc (qtdBytes * sizeof (char)); if (ptr == NULL) { cout << "Memória cheia! malloc devolveu NULL!\n"; exit (EXIT_FAILURE); } Funções de alocação dinâmica ● Função free( ) ● As variáveis alocadas dinâmicamente continuam a existir mesmo depois que a execução da função termina. ● Para liberar a memória ocupada por essas variáveis, é preciso recorrer à função free( ). ● Libera a porção de memória alocada por malloc. ● Avisa o sistema de que o bloco de bytes apontado pela variável está livre. ● A função free não deve ser aplicada a uma parte de um bloco de bytes alocado por malloc, apenas ao bloco todo. char* ptr; int qtdBytes = 1; ptr = (char*) malloc(qtdBytes * sizeof (char)); free(ptr); ptr = NULL; Exemplo – Ponteiro com Vetor Exemplo – Ponteiro com Função (retorno da função) Exemplo – Ponteiro com Função (passagem de parâmetros) Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21
Compartilhar