aula 25: alocação dinâmica - introdução a programação · aulas anteriores memória ponteiro...
Post on 10-Feb-2019
222 Views
Preview:
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 ;
}
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)
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 ;
}
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
top related