1/54
BCC 201 - Introducao a Programacao I
Ponteiros
Guillermo Camara-ChavezUFOP
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 ;
}
49/54
Ponteiros: Passagem por valor e por referencia I
Criar uma estrutura empregrado com os seguintes campos:
I nome
I salario
I sexo
Inserir n empregados (criar um vetor dinamico)
50/54
Ponteiros: Passagem por valor e por referencia IIt 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 ( t rab , n ) ;P r i n t ( t rab , 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 ;
}
51/54
Ponteiros: Passagem por valor e por referencia 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 ( c i n , 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 ( 10 0 , ’\n’ ) ;
}e l s e b r e a k ;
}w h i l e ( t r u e ) ;cout << "Insere sexo: " ; c i n >> v e t [ i ] . s e x o ;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’ ) ;}
}
52/54
Ponteiros: Passagem por valor e por referencia 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 ;
}}
53/54
Exercicios em Propostos I
1. Defina uma funcao que retorne a transposta de uma matriz xde dimensao 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 meda aritmetica de doisvalores reais utilizando apenas variaveis do tipo ponteiro.
54/54
FIM
Top Related