aula 25: alocação dinâmica - introdução a programação · aulas anteriores memória ponteiro...

69
Aula 25: Alocaªo Dinmica Introduªo a Programaªo Toelio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Departamento de Computaªo UFOP

Upload: lyminh

Post on 10-Feb-2019

221 views

Category:

Documents


0 download

TRANSCRIPT

Aula 25: Alocação DinâmicaIntrodução a Programação

Túlio Toffolo & Puca Huachihttp://www.toffolo.com.br

BCC201 – 2018/2Departamento de Computação – UFOP

Aulas anteriores

Memória

Ponteiro

Utilização de ponteiros

Aritmética de ponteiros

Alocação dinâmica

2 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Aula de hoje

1 Alocação dinâmica

2 Exercícios da última aula

3 Alocação dinâmica (slides do Prof. Guillermo Cámara-Chávez)

4 Exercícios

5 Próxima aula

2 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Aula de hoje

1 Alocação dinâmica

2 Exercícios da última aula

3 Alocação dinâmica (slides do Prof. Guillermo Cámara-Chávez)

4 Exercícios

5 Próxima aula

2 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Alocação dinâmica

Comando new:

Aloca dinamicamente um bloco consecutivo de bytes na memória eretorna o endereço deste bloco.

Isto permite escrever programas mais flexíveis.

Exemplo de uso: alocar um vetor de tamanho definido pelo usuário...

3 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Alocação dinâmica

Uso do método new para criar um double:

1 // aloca memória de forma dinâmica2 double *nro = new double;34 // altera o conteúdo da memória apontada por nro para 3.55 *nro = 3.5;67 cout << "Endereço de memória: " << nro << endl;8 cout << "Valor na memória: " << *nro << endl;

Este código imprimirá, por exemplo (arquitetura 64 bits):

1 Endereço de memória: 0x7feaf44006902 Valor na memória: 3.5

4 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Alocação dinâmica

Uso do método new para criar um double com valor inicial:

1 // aloca memória de forma dinâmica e inicializa com valor 10.52 double *nro = new double(10.5);34 cout << "Endereço de memória: " << nro << endl;5 cout << "Valor na memória: " << *nro << endl;

Este código imprimirá, por exemplo (arquitetura 64 bits):

1 Endereço de memória: 0x7feaf44006902 Valor na memória: 10.5

5 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Alocação dinâmica

Uso do método new para criar um bloco com 3 doubles:

1 // aloca memória de forma dinâmica e inicializa com valor 10.52 double *nro = new double[3];34 // alterando valores5 nro[0] = 1.1;6 nro[1] = 1.5;7 nro[2] = 2.2;89 for (int i = 0; i < 3; i++)

10 cout << nro[i] << " ";

Este código imprimirá:

1 1.1 1.5 2.2

6 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Exemplo de alocação dinâmica

67/81

Alocacao dinamica de memoria VIII

1 int main() {2 → int *a = nullptr;3 a = new int[6];4 for (int i = 0; i < 6; i++)5 a[i] = i;6 imprimeVetor3(a, 6);7 ...8 }

Cria o ponteiro a com valor inicialnullptr (0x0).

7 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Exemplo de alocação dinâmica

68/81

Alocacao dinamica de memoria IX

1 int main() {2 int *a = nullptr;3 → a = new int[6];4 for (int i = 0; i < 6; i++)5 a[i] = i;6 imprimeVetor3(a, 6);7 ...8 }

Aloca um bloco de memória com6 inteiros (usando o comandonew)

Armazena o endereço dememória no ponteiro a.

8 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Exemplo de alocação dinâmica

69/81

Alocacao dinamica de memoria X

1 int main() {2 int *a = nullptr;3 a = new int[6];4 → for (int i = 0; i < 6; i++)5 → a[i] = i;6 imprimeVetor3(a, 6);7 ...8 }

Altera o valor de a[0], a[1], ...,a[5]

9 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Muito importante: liberar a memória

A memória alocada pelo compilado é liberada ao final do escopo davariável automaticamente.

Quando fazemos alocação dinâmica, é nossa obrigação liberar amemória.

Em C++ usamos o operador delete

Exemplo (1):

1 int *a = new int;2 ...3 delete a;

10 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Muito importante: liberar a memória

A memória alocada pelo compilado é liberada ao final do escopo davariável automaticamente.

Quando fazemos alocação dinâmica, é nossa obrigação liberar amemória.

Em C++ usamos o operador delete

Exemplo (2):

1 int *v = new int[6];2 ...3 delete[] v;

11 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Aula de hoje

1 Alocação dinâmica

2 Exercícios da última aula

3 Alocação dinâmica (slides do Prof. Guillermo Cámara-Chávez)

4 Exercícios

5 Próxima aula

11 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Exercícios

Exercício 1Crie uma função que:1 recebe um vetor v e seu tamanho n por parâmetro;2 cria um novo vetor por alocação dinâmica, preenchendo-o com o

conteúdo de v em ordem inversa;3 retorna este novo vetor.

Dica: utilize o protótipo a seguir:

1 int *inverso(int *v, int n);

Crie um exemplo de utilização desta função no método main().

Não se esqueça de liberar memória!

12 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

1 #include <iostream>2 using namespace std;34 int *inverso(int *v, int n)5 {6 int *inv = new int[n];7 for (int i = 0; i < n; i++)8 inv[i] = v[n-1 - i];9 return inv;

10 }1112 int main()13 {14 int v[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };1516 // obtendo o inverso e imprimindo o resultado17 int *inv = inverso(v, 10);18 for (int i = 0; i < 10; i++)19 cout << inv[i] << " " << endl;2021 // liberando memória22 delete[] inv;2324 return 0;25 }

13 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Aula de hoje

1 Alocação dinâmica

2 Exercícios da última aula

3 Alocação dinâmica (slides do Prof. Guillermo Cámara-Chávez)

4 Exercícios

5 Próxima aula

13 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

2/54

Ponteiros ... I

i n t main ( ){

i n t x ;x = 10cout << "Conteudo de x: " << x ;cout << "Endereco de x: " << &x ;r e t u r n 0 ;

}

3/54

Ponteiros ... II

4/54

Ponteiros ... III

5/54

Ponteiros ... IV

6/54

Ponteiros ... V

7/54

Ponteiros ... VI

8/54

Ponteiros ... VII

9/54

Ponteiros ... VIII

10/54

Ponteiros ... IX

11/54

Ponteiros ... X

12/54

Ponteiros ... XI

13/54

Ponteiros ... XII

14/54

Ponteiros ... XIII

15/54

Ponteiros ... XIV

16/54

Ponteiros ... XV

17/54

Ponteiros ... XVI

18/54

Ponteiros ... XVII

19/54

Ponteiros ... XVIII

20/54

Aritmetica de Ponteiros I

I Uma variavel do tipo ponteiro esta sempre associada a umtipo

I Um ponteiro para um dado tipo t endereca o numero de bytesque esse tipo t ocupa na memoria, i.e., endereca sizeof(t)bytes.

I Se um ponteiro para uma variavel do tipo t for incrementadaatraves do operador ++, automaticamente este ponteiropassara a ter o valor x + sizeof(t)

21/54

Aritmetica de Ponteiros II

22/54

Aritmetica de Ponteiros III

23/54

Aritmetica de Ponteiros IV

24/54

Aritmetica de Ponteiros V

25/54

Aritmetica de Ponteiros VI

26/54

Aritmetica de Ponteiros VII

27/54

Aritmetica de Ponteiros VIII

28/54

Aritmetica de Ponteiros IX

29/54

Aritmetica de Ponteiros X

30/54

Aritmetica de Ponteiros XI

31/54

Relacao entre ponteiros e vetores I

I A aritmetica de ponteiros e particularmente importante paramanipulacao de vetores e strings.

I Quando declaramos um vetor seus elementos sao alocados emespacos de memoria vizinhos.

I O nome de um vetor equivale ao endereco do primeiroelemento dele (se um vetor possui nome v , entao, v equivalea v [0].

32/54

Relacao entre ponteiros e vetores II

i n t main ( ){c h a r ∗ ptr , v [ 3 ] = {’a’ , ’b’ , ’c’ } ;p t r = v ;cout << "v[0] = " << ∗ p t r ;cout << "v[1] = " << ∗(++ p t r ) ;cout << "v[2] = " << ∗(++ p t r ) ;r e t u r n ;

}

33/54

Vetores I

i n t main ( ){i n t i , ∗ ptr , v [ 3 ] ;p t r = &v [ 0 ] ; // ptr = v;// Usando indices para acessar vf o r ( i = 0 ; i < 3 ; i ++){

c i n >> v [ i ] ;}// Usando ponteirosf o r ( i = 0 ; i < 3 ; i ++, p t r ++){

cout >> ∗ p t r ;}r e t u r n 0 ;

}

34/54

Alocacao Dinamica de Memoria I

i n t main ( ){i n t i , n ; d o u b l e ∗ nota = n u l l p t r ;cout << "Entre com o tamanho" ;c i n >> n ;// Aloca 8*n bytes de memorianota = new d o u b l e [ n ] ;f o r ( i = 0 ; i < n ; i ++){

cout << "Entre a nota: " << i +1 << e n d l ;c i n >> nota [ i ] ;

}f o r ( i = 0 ; i < n ; i ++)

cout << nota [ i ] << " " ;d e l e t e [ ] nota ;r e t u r n 0 ;

}

35/54

Alocacao Dinamica de Memoria II

Comando Liberacao Memoria

AlocacaoEstaticadeMemoria

i n t v [ 3 ] ;

Reserva 3 espacos de 4bytes em v

O propio programa ao serencerrado, se encarregade liberar a memoria alo-cada.

AlocacaoDinamicadeMemoria

v = new i n t [ n ] ;

Reserva n espacos de 4bytes em v

Se nao for usar maisa variavel v , entao, enecessario empregar ocomando delete[].

36/54

Relacao entre ponteiros, vetores e matrizes I

I Assim como e possıvel alocar memoria em tempo de execucaopara armazenar um vetor, tambem, e possıvel construir umamatriz M com m linhas e n colunas. Os comandos para taltarefa sao como dados a seguir:

i n t main ( ){

i n t ∗∗M,i n t m, n , i ;cout << "Entre com m e n" ;c i n >> m >> n ;// Vetor de enderecos (os elementos sao do tipo char*)M = new i n t ∗ [m] ;// Cria para cada endereco um vetor de elementos intf o r ( i = 0 ; i < m; i ++)

M[ i ] = new i n t [ n ]. . .r e t u r n 0 ;

}

37/54

Relacao entre ponteiros, vetores e matrizes II

I Vejamos um exemplo:

M = new i n t ∗ [ 3 ] ;

38/54

Relacao entre ponteiros, vetores e matrizes III

39/54

Relacao entre ponteiros, vetores e matrizes IV

40/54

Relacao entre ponteiros, vetores e matrizes V

41/54

Relacao entre ponteiros, vetores e matrizes VI

42/54

Liberacao de memoria I

43/54

Liberacao de memoria II

44/54

Liberacao de memoria III

45/54

Liberacao de memoria IV

46/54

Exercicios I

Inserir n notas de um total de m alunos

47/54

Exercicios II

i n t main ( ){ i n t i , j , m, n ; f l o a t ∗∗M = n u l l p t r ;

cout << "Entre com m e n: " ;c i n >> m >> n ;// Aloca m espacos tipo float *.M = new f l o a t ∗ [m] ;// Aloca n espacos tipo float, cada M[i].f o r ( i = 0 ; i < m; i ++)

M[ i ] = new f l o a t [ n ] ;// Preenchendo a matriz M usando ındices: M[i][j].f o r ( i =0; i < m; i ++){ cout << "Aluno: " << i +1 << e n d l ;

f o r ( j =0; j < n ; j ++){ cout << " Nota " << j +1;

c i n >> M[ i ] [ j ] ;}

}. . .

}

48/54

Exercicios III

. . .// Impressao dos elementos de M, empregando ponteiros.f o r ( i =0; i < m; i ++){ f o r ( j =0; j < n ; j ++)

cout << M[ i ] [ j ] <<" " ;cout << e n d l ;

}// Liberacao de memoria.// Liberando m vetores de tamanho n.i f (M != n u l l p t r ){

f o r ( i =0; i < m; i ++)i f (M[ i ] != n u l l p t r ) d e l e t e [ ] M[ i ] ;

// Liberando o vetor de ponteiros// de tamanho m.d e l e t e [ ] M;

}r e t u r n 0 ;

}

Aula de hoje

1 Alocação dinâmica

2 Exercícios da última aula

3 Alocação dinâmica (slides do Prof. Guillermo Cámara-Chávez)

4 Exercícios

5 Próxima aula

13 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Exercício 1Defina uma função que retorne a transporta de uma matriz m comlins×cols elementos. Utilize o protótipo a seguir:

1 int ** transposta(int **m, int lins, int cols);

Dica: dada uma matriz A de tamanho n×m, lembre-se que suatransposta T tem tamanho m× n e cada célula Ti,j = Aj,i.

1 int **transporta(int **m, int lins, int cols)2 {3 int **t = new int*[cols];4 for (int i = 0; i < cols; i++) {5 t[i] = new int[lins];6 for (int j = 0; j < lins; j++) {7 t[i][j] = m[j][i];8 }9 }

10 return t;11 }

14 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Aula de hoje

1 Alocação dinâmica

2 Exercícios da última aula

3 Alocação dinâmica (slides do Prof. Guillermo Cámara-Chávez)

4 Exercícios

5 Próxima aula

14 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

Próxima aula

Estruturas de dados heterogêneas

15 / 15 Túlio Toffolo & Puca Huachi – Introdução a Programação – Aula 25: Alocação Dinâmica

/ 12

Perguntas?