BCC 201 - Introdução à Programação I Ponteiros Guillermo Cámara-Chávez UFOP 1/54
Ponteiros... I i n t main ( ) { i n t x ; x = 10 cout << " Conteudo de x: " << x ; cout << " Endereco de x: " << &x ; r e t u r n 0 ; } 2/54
Ponteiros... II 3/54
Ponteiros... III 4/54
Ponteiros... IV 5/54
Ponteiros... V 6/54
Ponteiros... VI 7/54
Ponteiros... VII 8/54
Ponteiros... VIII 9/54
Ponteiros... IX 10/54
Ponteiros... X 11/54
Ponteiros... XI 12/54
Ponteiros... XII 13/54
Ponteiros... XIII 14/54
Ponteiros... XIV 15/54
Ponteiros... XV 16/54
Ponteiros... XVI 17/54
Ponteiros... XVII 18/54
Ponteiros... XVIII 19/54
Aritmética de Ponteiros I Uma variável do tipo ponteiro está sempre associada a um tipo Um ponteiro para um dado tipo t endereça o número de bytes que esse tipo t ocupa na memória, i.e., endereça sizeof(t) bytes. Se um ponteiro para uma variável do tipo t for incrementada através do operador ++, automaticamente este ponteiro passará a ter o valor x + sizeof(t) 20/54
Aritmética de Ponteiros II 21/54
Aritmética de Ponteiros III 22/54
Aritmética de Ponteiros IV 23/54
Aritmética de Ponteiros V 24/54
Aritmética de Ponteiros VI 25/54
Aritmética de Ponteiros VII 26/54
Aritmética de Ponteiros VIII 27/54
Aritmética de Ponteiros IX 28/54
Aritmética de Ponteiros X 29/54
Aritmética de Ponteiros XI 30/54
Relação entre ponteiros e vetores I A aritmética de ponteiros é particularmente importante para manipulação de vetores e strings. Quando declaramos um vetor seus elementos são alocados em espaços de memória vizinhos. O nome de um vetor equivale ao endereço do primeiro elemento dele (se um vetor possui nome v, então, v equivale a v[0]. 31/54
Relação 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 ; } 32/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 v f o r ( i = 0 ; i < 3 ; i ++){ c i n >> v [ i ] ; } // Usando ponteiros f o r ( i = 0 ; i < 3 ; i ++, p t r ++){ cout >> p t r ; } r e t u r n 0 ; } 33/54
Alocação Dinâmica de Memória 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 memoria nota = 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 ; } 34/54
Alocação Dinâmica de Memória II Alocação Estática de Memória Alocação Dinâmica de Memória Comando i n t v [ 3 ] ; Reserva 3 espaços de 4 bytes em v v = new i n t [ n ] ; Reserva n espaços de 4 bytes em v Liberação Memória O propio programa ao ser encerrado, se encarrega de liberar a memória alocada. Se não for usar mais a variável v, então, é necessário empregar o comando delete[]. 35/54
Relação entre ponteiros, vetores e matrizes I Assim como é possível alocar memória em tempo de execução para armazenar um vetor, também, é possível construir uma matriz M com m linhas e n colunas. Os comandos para tal tarefa são 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 endereços (os elementos são do tipo char*) M = new i n t [m] ; // Cria para cada endereço um vetor de elementos int f o r ( i = 0 ; i < m; i ++) M[ i ] = new i n t [ n ]... r e t u r n 0 ; } 36/54
Relação entre ponteiros, vetores e matrizes II Vejamos um exemplo: M = new i n t [ 3 ] ; 37/54
Relação entre ponteiros, vetores e matrizes III 38/54
Relação entre ponteiros, vetores e matrizes IV 39/54
Relação entre ponteiros, vetores e matrizes V 40/54
Relação entre ponteiros, vetores e matrizes VI 41/54
Liberação de memória I 42/54
Liberação de memória II 43/54
Liberação de memória III 44/54
Liberação de memória IV 45/54
Exercicios I Inserir n notas de um total de m alunos 46/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 espaços tipo float *. M = new f l o a t [m] ; // Aloca n espaços 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 ] ; } }... } 47/54
Exercicios III }... // Impressão 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 ; } // Liberação de memória. // 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 ; 48/54
Ponteiros: Passagem por valor e por referência I Criar uma estrutura empregrado com os seguintes campos: nome salario sexo Inserir n empregados (criar um vetor dinâmico) 49/54
Ponteiros: Passagem por valor e por referência II t y p e d e f s t r u c t Pessoa { s t r i n g nome ; d o u b l e s a l a r i o ; c h a r s e x o ; }PE ; v o i d I n s e r e (PE, i n t ) ; v o i d P r i n t (PE, i n t ) ; i n t main ( ) { i n t n ; PE t r a b = NULL ; cout << " Quantidade de pessoas " ; c i n >> n ; t r a b = new PE [ n ] ; I n s e r e ( trab, n ) ; P r i n t ( trab, n ) ; i f ( t r a b!= n u l l p t r ) d e l e t e [ ] t r a b ; r e t u r n 0 ; } 50/54
Ponteiros: Passagem por valor e por referência III v o i d I n s e r e (PE vet, i n t n ){ i n t i, v a l o r e s ; f o r ( i = 0 ; i < n ; i ++) { cout << " Cadastro numero " << i +1 << e n d l ; cout << "Insere nome: " ; g e t l i n e ( cin, v e t [ i ]. nome ) ; do{ cout << "Insere salario : " ; c i n >> v e t [ i ]. s a l a r i o ; i f ( c i n. f a i l ( ) ){ cout << "Nao eh um numero \n" ; c i n. c l e a r ( ) ; c i n. i g n o r e (100, \n ) ; } e l s e b r e ak ; } w h i l e ( t r u e ) ; cout << "Insere sexo: " ; c i n >> v e t [ i ]. s e xo ; c i n. i g n o r e ( n u m e r i c l i m i t s <s t d : : s t r e a m s i z e >:: max ( ), \n ) ; } } 51/54
Ponteiros: Passagem por valor e por referência IV v o i d P r i n t (PE vet, i n t n ) { i n t i ; f o r ( i = 0 ; i < n ; i ++) { cout << v e t [ i ]. nome << v e t [ i ]. s a l a r i o << v e t [ i ]. s e x o << e n d l ; } } 52/54
Exercicios em Propostos I 1. Defina uma função que retorne a transposta de uma matriz x de dimensão lin col. i n t T r a n s p o s t a ( i n t M, i n t l i n, i n t c o l ) 2. Elaborar um programa para calcular a méda aritmética de dois valores reais utilizando apenas variáveis do tipo ponteiro. 53/54
FIM 54/54