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

Post on 12-Dec-2018

218 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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