ponteiros e alocação dinâmica - gileduardo.com.br · ponteiros variável: padrão x ponteiro...

29
Linguagem de Programação Gil Eduardo de Andrade Ponteiros e Alocação Dinâmica

Upload: truongngoc

Post on 12-Dec-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Linguagem de Programação

Gil Eduardo de Andrade

Ponteiros e Alocação Dinâmica

Page 2: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 3: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 4: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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.

Page 5: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 6: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 7: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 8: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Ponteiros

Exemplos de Codificação (declaração e operadores):

Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade

Page 9: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Ponteiros

Exemplos de Codificação (declaração e operadores):

Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade

Page 10: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Ponteiros

Exemplos de Codificação (impressão e operadores):

Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade

Page 11: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Ponteiros

Exemplos de Codificação (impressão e operadores):

Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade

Page 12: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Ponteiros

Exemplos de Codificação (endereço de memória):

Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade

Page 13: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

Ponteiros

Exemplos de Codificação (endereço de memória):

Aula 11: Ponteiros e Alocação Dinâmica– Gil Eduardo de Andrade

Page 14: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 15: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 16: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 17: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 18: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 19: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 20: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 21: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 22: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 23: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 24: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 25: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 26: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 27: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 28: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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

Page 29: Ponteiros e Alocação Dinâmica - gileduardo.com.br · Ponteiros Variável: Padrão x Ponteiro •Uma variável padrão faz referência direta para umvalor armazenado em memória;

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