Buscar

Ponteiros e Alocação Dinâmica

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

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes