ponteiros e alocação dinâmica - gileduardo.com.br · ponteiros variável: padrão x ponteiro...
Post on 12-Dec-2018
219 Views
Preview:
TRANSCRIPT
Linguagem de Programação
Gil Eduardo de Andrade
Ponteiros e Alocação Dinâmica
Ponteiros
Introdução
• O ponteiro é uma variável que contém umendereço de memória, normalmente relativoa localização de uma outra variável emmemória;
• Sendo assim chamamos uma variável deponteiro porque esta aponta para o endereçode memória onde encontra-se outra variável;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Variável: Padrão x Ponteiro
• Uma variável padrão faz referência direta paraum valor armazenado em memória;
• Uma variável ponteiro contém o endereço dememória de outra variável que faz referênciadireta ou não para um valor armazenado emmemória;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Variável: Padrão x Ponteiro
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
-12
21
0010
Variável
Endereço de Memória
x
y
Ponteiro
p
0001
0010
0101
0011
0100
0110
Conteúdo do Endereço
O ponteiro p armazenada oendereço de memória davariável y (0010) quepossui como conteúdo ovalor 21. Observe que oponteiro p não armazena ovalor 21 mas sim oendereço de memória davariável y.
Ponteiros
Utilização de Ponteiro
• Permite a utilização de alocação dinâmica, onde éposição determinar o tamanho de um vetor oumatriz durante a execução do programa;
• Possibilita que funções modifiquem o conteúdode seus argumentos;
• Aumenta a eficiência de determinadas rotinas –ficam mais rápidas;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Codificação: declaração
• A declaração de ponteiros em C é efetuada daseguinte maneira:– tipo *nome_ponteiro;
• tipo: indica qual tipo de variável será apontada pelo ponteirodeclarado – ex.: int, float, double;
• *: indica que a variável declarada se trata de um ponteiro;
• nome_ponteiro: indica o nome pelo qual o ponteiro é referenciado;
• Exemplo:– int *p_int;
– char *p_char;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Operadores
• Existem dois operadores especiais paraponteiros:
– “&”: retorna o endereço de memória;
• Ex.: int *p = &a; (p recebe o endereço de memória de a)
– “*”: retorna o conteúdo (valor) da variável;
• Ex.: int b = *p; (b recebe o conteúdo do endereço de
memória apontado por p)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Exemplos de Codificação (declaração e operadores):
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Exemplos de Codificação (declaração e operadores):
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Exemplos de Codificação (impressão e operadores):
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Exemplos de Codificação (impressão e operadores):
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Exemplos de Codificação (endereço de memória):
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros
Exemplos de Codificação (endereço de memória):
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Introdução
• Alocação dinâmica é o meio pelo qual umprograma pode obter memória durante a suaexecução;
• Variáveis locais e globais não podem obter maismemória durante o tempo de execução;
• Portanto para obter maior quantidade dememória em tempo de execução utilizamosponteiros e alocação dinâmica de memória;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Principais Funções
• A linguagem C possui diversas funções dealocação dinâmica, contudo suas principaissão a função malloc() e a função free();
– malloc(): aloca a quantidade de memórianecessária;
– free(): libera a quantidade de memória alocada;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Função malloc()
• void* malloc(size_t * numero_bytes);
– void*: retorna um ponteiro para qualquer tipo, ouseja, pode ser utilizada para qualquer tipo de ponteiro(int *; char *);
– size_t: definido na biblioteca <stdlib.h>, uma espéciede ponteiro sem sinal;
– mumero_bytes: total de bytes que se deseja alocar;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Exemplo: função malloc()
• int* p = malloc(10 * sizeof(int));
• Aloca espaço de memória para 10 valoresinteiros, o sizeof(int) garante que seja alocado 10vezes o tamanho de um inteiro na memória;
• Observe que cada tipo possui um tamanhoespecífico, por exemplo, um double utiliza umespaço de memória maior que um int;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Exemplo de Codificação (alocação dinâmica - int)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Observe que a biblioteca<stdlib.h> foi incluída para queseja possível utilizar a função esizeof() e trabalhar comalocação dinâmica
Alocação Dinâmica
Exemplo de Codificação (alocação dinâmica - int)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Exemplo de Codificação (alocação dinâmica - char)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Alocação Dinâmica
Exemplo de Codificação (alocação dinâmica - char)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Introdução
• Realocação dinâmica é o meio pelo qual umprograma pode obter memória, mais de uma vezpara um mesmo ponteiro, durante a suaexecução;
• Na linguagem C a função de realocação dinâmica,que permite efetuar tal processo é a realloc();– realloc(): realoca a quantidade de memórianecessária;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Exemplo: função realloc()
• char* p = realloc(void*, 12 * sizeof(char));• Realoca o tamanho do ponteiro “p” para 12, o
sizeof(char) garante que seja alocado 12 vezes otamanho de um caractere em memória;
• Observe que diferentemente da função malloc()a função realloc() possui um parâmetro a mais(void*) que indica se o conteúdo atual de “p”deve ser mantido após a realocação ou não;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Exemplo: função realloc()
• Ex1.: char* p = realloc(NULL, 12 * sizeof(char));
– Realoca o ponteiro “p” com tamanho ’12’ sem mantero seu conteúdo;
• Ex2.: char* p = realloc(p, 12 * sizeof(char));
– Realoca o ponteiro “p” com tamanho ’12’ mantendo oseu conteúdo;
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Exemplo de Codificação (realocação dinâmica - NULL)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Exemplo de Codificação (realocação dinâmica - NULL)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Exemplo de Codificação (realocação dinâmica – NOT NULL)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Realocação Dinâmica
Exemplo de Codificação (realocação dinâmica – NOT NULL)
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Ponteiros e Alocação Dinâmica
Exemplos Utilizados no Documentohttp://www.gileduardo.com.br/ifpr/pcii/downloads/pc_exdoc11.zip
Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade
Mais Exemplos sobre o Conteúdohttp://www.gileduardo.com.br/ifpr/pcii/downloads/pc_ex11.zip
Exercícios sobre o Conteúdo
http://www.gileduardo.com.br/ifpr/lp/downloads/lp_pratica11.pdf
top related