BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI...

54
1/54 BCC 201 - Introdu¸ ao ` a Programa¸ ao I Ponteiros Guillermo C´ amara-Ch´ avez UFOP

Transcript of BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI...

Page 1: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

1/54

BCC 201 - Introducao a Programacao I

Ponteiros

Guillermo Camara-ChavezUFOP

Page 2: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 3: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

3/54

Ponteiros ... II

Page 4: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

4/54

Ponteiros ... III

Page 5: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

5/54

Ponteiros ... IV

Page 6: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

6/54

Ponteiros ... V

Page 7: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

7/54

Ponteiros ... VI

Page 8: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

8/54

Ponteiros ... VII

Page 9: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

9/54

Ponteiros ... VIII

Page 10: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

10/54

Ponteiros ... IX

Page 11: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

11/54

Ponteiros ... X

Page 12: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

12/54

Ponteiros ... XI

Page 13: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

13/54

Ponteiros ... XII

Page 14: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

14/54

Ponteiros ... XIII

Page 15: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

15/54

Ponteiros ... XIV

Page 16: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

16/54

Ponteiros ... XV

Page 17: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

17/54

Ponteiros ... XVI

Page 18: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

18/54

Ponteiros ... XVII

Page 19: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

19/54

Ponteiros ... XVIII

Page 20: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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)

Page 21: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

21/54

Aritmetica de Ponteiros II

Page 22: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

22/54

Aritmetica de Ponteiros III

Page 23: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

23/54

Aritmetica de Ponteiros IV

Page 24: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

24/54

Aritmetica de Ponteiros V

Page 25: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

25/54

Aritmetica de Ponteiros VI

Page 26: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

26/54

Aritmetica de Ponteiros VII

Page 27: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

27/54

Aritmetica de Ponteiros VIII

Page 28: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

28/54

Aritmetica de Ponteiros IX

Page 29: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

29/54

Aritmetica de Ponteiros X

Page 30: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

30/54

Aritmetica de Ponteiros XI

Page 31: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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].

Page 32: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 33: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 34: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 35: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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[].

Page 36: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 37: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

37/54

Relacao entre ponteiros, vetores e matrizes II

I Vejamos um exemplo:

M = new i n t ∗ [ 3 ] ;

Page 38: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

38/54

Relacao entre ponteiros, vetores e matrizes III

Page 39: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

39/54

Relacao entre ponteiros, vetores e matrizes IV

Page 40: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

40/54

Relacao entre ponteiros, vetores e matrizes V

Page 41: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

41/54

Relacao entre ponteiros, vetores e matrizes VI

Page 42: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

42/54

Liberacao de memoria I

Page 43: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

43/54

Liberacao de memoria II

Page 44: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

44/54

Liberacao de memoria III

Page 45: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

45/54

Liberacao de memoria IV

Page 46: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

46/54

Exercicios I

Inserir n notas de um total de m alunos

Page 47: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ] ;}

}. . .

}

Page 48: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 49: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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)

Page 50: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}

Page 51: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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’ ) ;}

}

Page 52: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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 ;

}}

Page 53: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

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.

Page 54: BCC 201 - Introdução à Programação I Ponteiros+.pdf31/54 Rela˘c~ao entre ponteiros e vetoresI I A aritm etica de ponteiros e particularmente importante para manipula˘c~ao de

54/54

FIM