51
Profª Valéria de Carvalho Santos BCC702 - Programação de Computadores II Ponteiros Alocação Dinâmica de Memória 1

Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Profª Valéria de Carvalho Santos

BCC702 - Programação de Computadores II

PonteirosAlocação Dinâmica de Memória

1

Page 2: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Variáveis

❏ Usamos nomes/identificadores de variáveis para armazenar valores

❏ Uma variável corresponde a um “espaço” na memória❏ O nome de uma variável no programa refere-se ao

conteúdo que esta variável armazena.

2

Page 3: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Variáveis

3

int main(){int a = 5;double b = 2.3;double c = a*b;

}

Page 4: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Variáveis

4

int main(){int a = 5;double b = 2.3;double c = a*b;

}

5 115.02.3

a b c

Memória

Page 5: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Variáveis

5

int main(){int a = 5;double b = 2.3;double c = a*b;

}

Memória

5 115.02.3

a b c

001 002 003

Page 6: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Variáveis

6

int main(){int a = 5;double b = 2.3;double c = a*b;

}

Memória

5 115.02.3

a b c

001 002 003

nome

valor

endereço

Page 7: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiro

❏ Armazena o endereço de uma variável❏ Indica em que parte da memória a variável está alocada❏ Proporciona um modo de acesso à variável sem

referenciá-la diretamente

7

Page 8: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiro

❏ Seja um ponteiro p que armazena o endereço de uma variável x, cujo valor é 80. Diz-se que p aponta para x.

8

Variável x p

Valor 80 021

Endereço 021 028

Page 9: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiro

❏ Seja um ponteiro p que armazena o endereço de uma variável x, cujo valor é 80. Diz-se que p aponta para x.

9

Variável x p

Valor 80 021

Endereço 021 028

021

80

p

x

021

Page 10: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Por que usar ponteiros?

❏ Modificar parâmetros de funções (passagem por referência)

❏ Alocar e desalocar memória dinamicamente do sistema❏ Criar estruturas de dados complexas❏ Passagem de funções como parâmetro (não veremos

aqui)

10

Page 11: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Declaração de ponteiros

❏ Tipo da variável que ele armazena do endereço, seguido do operador * e o nome do ponteiro.

❏ Podem ser declarados para qualquer tipo de dados, incluindo registros (struct)

11

tipo *nome;

Page 12: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operadores de ponteiros

❏ Para manipulação de endereços de memória, a linguagem C/C++ oferece dois operadores:❏ O operador & (“endereço de”)❏ O operador * (“conteúdo de”)

12

Page 13: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operadores &

❏ O operador & (“endereço de”): quando aplicado a uma variável resulta no endereço dessa variável na memória do computador.

13

Page 14: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador &

❏ Exemplo

14

Variável a

Valor 5

Endereço 1084

Page 15: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador &

❏ Exemplo

15

Variável a

Valor 5

Endereço 1084

int a;a = 5;cout << “Valor de a: ” << a << endl;cout << “Endereço de a: ” << &a << endl;

Page 16: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador &

❏ Exemplo

16

Variável a

Valor 5

Endereço 1084

int a;a = 5;cout << “Valor de a: ” << a << endl;cout << “Endereço de a: ” << &a << endl;

Valor de a: 5Endereço de a: 1084

Page 17: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador *

❏ O operador * (“conteúdo de”): é aplicado a ponteiros, permitindo acessar o conteúdo do endereço de memória armazenado por ele

17

Page 18: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador *

❏ Exemplo

18

Variável a ptr

Valor

Endereço 1084 1087

int a, *ptr;a = 5;ptr = &a;*ptr = 25;

Page 19: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador *

❏ Exemplo

19

Variável a ptr

Valor 5

Endereço 1084 1087

int a, *ptr;a = 5;ptr = &a;*ptr = 25;

Page 20: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador *

❏ Exemplo

20

Variável a ptr

Valor 5 1084

Endereço 1084 1087

int a, *ptr;a = 5;ptr = &a;*ptr = 25;

Page 21: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador *

❏ Exemplo

21

Variável a ptr

Valor 5 1084

Endereço 1084 1087

int a, *ptr;a = 5;ptr = &a;*ptr = 25;

1084

5

ptr

a

1084

Page 22: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operador *

❏ Exemplo

22

Variável a ptr

Valor 25 1084

Endereço 1084 1087

int a, *ptr;a = 5;ptr = &a;*ptr = 25;

Page 23: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operadores

❏ Qual é a saída desse programa?

23

int main(){int i = 1;cout << i << “, ”;int *ptr = &i;*ptr = 2;cout << i << “, ”;i = 1;cout << *ptr << endl;return 0;

}

Page 24: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Operadores

❏ Qual é a saída desse programa?

24

int main(){int i = 1;cout << i << “, ”;int *ptr = &i;*ptr = 2;cout << i << “, ”;i = 1;cout << *ptr << endl;return 0;

}1, 2, 1

Page 25: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros para registros

❏ Quando ponteiros apontam para registros, o acesso aos campos desses registros pode ser realizado de duas formas:❏ usando o operador * (“conteúdo de”)❏ usando o operador -> (“seta”)

25

Page 26: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros para registros

26

struct Ponto{int x, y;

};int main(){

Ponto p1, *ptr;p1.x = 2;p1.y = 3;ptr = &p1;cout << p1.x << “, ” << p1.y << endl;cout << ptr->x << “, ” << ptr->y << endl;cout << (*ptr).x << “, ” << (*ptr).y << endl;return 0;

}

Page 27: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros e parâmetros de funções

❏ Vimos que há duas formas de passagem de parâmetros para funções:❏ por valor: os valores dos argumentos da chamada da

função são copiados para os parâmetros da função❏ por referência: os valores dos argumentos da

chamada da função são vinculados aos parâmetros da função

27

Page 28: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros e parâmetros de funções

❏ Passagem de ponteiros para funções: esse é um caso específico de passagem por valor, em que o valor copiado é o endereço da variável ❏ Dessa forma, os valores também podem ser

alterados (como na passagem por referência)

28

Page 29: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros e parâmetros de funções

29

void troca(int *a, int *b){int temp = *a;*a = *b;*b = temp;

}int main(){

int x = 2, y = 3;cout << “x = ” << x << “y = ” << y << endl;troca(&x, &y);cout << “x = ” << x << “y = ” << y << endl;return 0;

}

Page 30: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros e vetores

❏ Existe uma associação forte entre vetores e ponteiros❏ Na declaração

int v[10];

na verdade a variável v armazena o endereço inicial do vetor

❏ Passar um vetor para uma função consiste em passar o endereço da primeira posição do vetor. 30

Page 31: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Ponteiros e vetores

31

void imprime_vetor1(int *v, int n){for(int i=0; i<n; i++)

cout << v[i] << endl;}

void imprime_vetor2(int v[ ], int n){for(int i=0; i<n; i++)

cout << v[i] << endl;}

int main(){int v[ ] = {1, 2, 3};imprime_vetor1(v, 3);imprime_vetor2(v, 3);return 0;

}

Page 32: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Alocação estática de memória❏ O espaço reservado para uma variável existe

enquanto o programa estiver sendo executado❏ Para uma variável declarada em uma função, o

espaço reservado existe apenas enquanto a função estiver sendo executada

32

Page 33: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Alocação dinâmica de memória❏ O espaço de memória é requisitado em tempo de

execução❏ O espaço permanece reservado até que seja

explicitamente liberado❏ O espaço alocado e não liberado explicitamente será

automaticamente liberado ao final da execução

33

Page 34: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Por que usar alocação dinâmica de memória?❏ Permite melhor controle de uso da memória do

computador (quando alocar memória, o quanto alocar, por quanto tempo deixar alocado)

❏ Não se restringe ao tamanho da pilha de execução (stack) reservada ao programa, uma vez que o espaço é alocado em outra região da memória, denominada heap.

34

Page 35: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ A alocação dinâmica de memória é feito pelo uso do operador new:❏ recebe o tipo de dado a ser alocado;❏ encontra o bloco de memória com o tamanho

necessário❏ retorna o endereço (da primeira posição) do bloco

alocado

35

Page 36: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo:

36

int *ptr;ptr = new int;*ptr = 13;

Page 37: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo:

37

int *ptr;ptr = new int;*ptr = 13;

ptr

Page 38: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo:

38

int *ptr;ptr = new int;*ptr = 13;

ptr

Page 39: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo:

39

int *ptr;ptr = new int;*ptr = 13;

13

ptr

Page 40: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo:

❏ Alocou-se um bloco de memória para armazenar um inteiro e o endereço dessa alocação é armazenado no ponteiro ptr.

40

int *ptr;ptr = new int;*ptr = 13;

13

ptr

Page 41: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Quando um espaço é alocado com o operador new, este espaço não é desalocado automaticamente

❏ A desalocação deste espaço de memória é responsabilidade do programador

❏ Para desalocar espaço de memória é utilizado o comando delete

41

Page 42: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo:

42

int *ptr;ptr = new int;*ptr = 13;delete ptr;

Page 43: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Alocação dinâmica de vetor:int *ptr = new int[N];

❏ Os elementos de vetor alocado podem ser acessados normalmente, como os de um vetor comum:

ptr[0] = 5;ptr[1] = -27;

❏ Para desalocar o vetor é necessário usar [ ] após delete:delete[ ] ptr;

43

Page 44: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Outro motivo para usar ponteiros e alocação dinâmica de memória é a possibilidade de retornar vetores a partir de funções:

44

int* criar_vetor(int tam){int *meu_vetor = new int[tam];return meu_vetor;

}

int main(){int *vetor = criar_vetor(2);vetor[0] = 2;vetor[1] = 6;delete[ ] vetor;return 0;

}

Page 45: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Alocação dinâmica de memória

❏ Exemplo: alocando e desalocando registro

45

Ponto *ptr = new Ponto;ptr ->x = 2;ptr ->x = 3;delete ptr;

Page 46: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Cuidados com o uso de ponteiros

❏ Ponteiros soltos: um ponteiro solto é aquele que contém o endereço de memória de uma região que já foi liberada

46

Page 47: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Cuidados com o uso de ponteiros

❏ Ponteiros soltos: um ponteiro solto é aquele que contém o endereço de memória de uma região que já foi liberada

47

int *ptr = new int;delete ptr;*ptr = 2;

Page 48: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Cuidados com o uso de ponteiros

❏ Variáveis dinâmicas perdidas: uma variável que foi alocada dinamicamente, mas não está mais acessível, pois não ponteiros que apontem para ela.

48

Page 49: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Cuidados com o uso de ponteiros

❏ Variáveis dinâmicas perdidas: uma variável que foi alocada dinamicamente, mas não está mais acessível, pois não ponteiros que apontem para ela.

49

int *ptr1 = new int;int *ptr2 = new int;ptr1 = ptr2;

Page 50: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Cuidados com o uso de ponteiros

❏ Variáveis dinâmicas perdidas: uma variável que foi alocada dinamicamente, mas não está mais acessível, pois não ponteiros que apontem para ela.

50

int *ptr1 = new int;int *ptr2 = new int;ptr1 = ptr2;

O espaço alocado para ptr1 ficou perdido: não pode mais ser liberado explicitamente, nem pode ser reutilizado no programa.

Page 51: Ponteiros Alocação Dinâmica de Memória · Alocação dinâmica de memória Por que usar alocação dinâmica de memória? Permite melhor controle de uso da memória do computador

Exercício

Faça um programa que declare duas variáveis do tipo double e solicite os valores das mesmas ao usuário. Em seguida, guarde o valor da soma em memória alocada dinamicamente. Por fim, exiba o valor da soma.

51