1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++...

26
1 Aula 4 Ponteiros

Transcript of 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++...

Page 1: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

1

Aula 4

Ponteiros

Page 2: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos2

Instâncias de um programa C++

int i = 10;

Nome: i

Tipo: int

Valor: 10

Page 3: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos3

O que é a memória?

Sequência de bytes com números sucessivos Números são endereços Bytes são a unidade básica de memória e têm

8 bits

Também denominados de octetos.

Page 4: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos4

Memória

10

i: int

12 13 14 15

Page 5: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos5

Ponteiros

Guardam endereços de variáveis

Ponteiro para int: int* p;

Contém lixo!

p guarda o endereço de um int.

Page 6: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos6

Operações com ponteiros

Operador endereço (&): int* p = &i;

10

i: int

12 13 14 15

12

p: int*

24 25 26 27

Page 7: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos7

Operações com ponteiros

Operador endereço (&): int* p = &i;

Operador conteúdo (*): cout << *p << endl; *p = 20;

10

Page 8: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos8

Memória

20

i: int

12 13 14 15

12

p: int*

24 25 26 27

Page 9: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos9

Contextos…

int i = 10;

int& j = i;

int* p = &i;

int k = *p;

Define uma referência para um int.

Define um ponteiro para um int.

Operador que devolve o endereço de i.

Operador que devolve o conteúdo de p.

Page 10: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos10

Ponteiros e matrizes

int m[5] = {6, 7, 8, 9, 10};int* p = &m[0];p = p + 1;*p = 20;

Page 11: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos11

Memória

20 24 28 32 36 52

6

m[0]: int

7

m[1]: int

8

m[2]: int

9

m[3]: int

10

m[4]: int

20

p: int*

Page 12: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos12

Ponteiros e matrizes

int m[5] = {6, 7, 8, 9, 10};int* p = &m[0];p = p + 1;*p = 20;

Page 13: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos13

Memória

20 24 28 32 36 52

6

m[0]: int

7

m[1]: int

8

m[2]: int

9

m[3]: int

10

m[4]: int

24

p: int*

Page 14: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos14

Ponteiros e matrizes

int m[5] = {6, 7, 8, 9, 10};int* p = &m[0];p = p + 1;*p = 20;

Page 15: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos15

Memória

20 24 28 32 36 52

6

m[0]: int

20

m[1]: int

8

m[2]: int

9

m[3]: int

10

m[4]: int

24

p: int*

Page 16: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos16

Indexação de matrizes

X[I] é o mesmo que *(X + I)

int m[5];m[2] = 10;

é interpretado como

int m[5];*(m + 2) = 10;

Page 17: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos17

Matrizes em expressões

Se uma matriz ocorrer numa expressão é convertida num ponteiro para o primeiro elemento:

int m[5];int* p = m;

É o mesmo que

int m[5];int* p = &m[0];

Page 18: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos18

Matrizes como argumento (I)

int soma(int const m[], int n)

{

int soma = 0;

for(int i = 0; i != n; ++i)

soma += m[i];

return soma;

}

int main()

{

int matriz[] = {2, 4, 6, 8};

cout << soma(matriz, 4) << endl;

}

Page 19: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos19

Matrizes como argumento (II)

cout << soma(matriz, 4) << endl;

é o mesmo que

cout << soma(&matriz[0], 4) << endl;

ou ainda

int* p = matriz; // ou &matriz[0]

cout << soma(p, 4) << endl;

Page 20: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos20

Matrizes como argumento (III)

int soma(int const m[], int n);

é o mesmo que

int soma(int const* m, int n);

Page 21: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos21

Matrizes como argumento (IV)

int soma(int const* m, int n)

{

int soma = 0;

for(int i = 0; i != n; ++i)

soma += m[i];

return soma;

}

int main()

{

int matriz[] = {2, 4, 6, 8};

cout << soma(matriz, 4) << endl;

}

Page 22: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos22

Matrizes multidimensionais

int m[3][2];int (*p)[2] = m;++p;p[0][0] = 10;

10

m: int[3][2]

Page 23: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos23

Aluno

class Aluno { public: Aluno(string const& nome = “”, int número = 0);

string const& nome() const; int número() const;

private: string nome_; int número_;};

Aluno::Aluno(string const& nome, int const número) : nome_(nome), número_(número) {}

string const& Aluno::nome() const{ return nome_;}

int Aluno::número() const{ return número_;}

Page 24: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos24

Ponteiros e classes (I)

int main(){ Aluno a(“Xico”, 12345); Aluno* p = &a; cout << (*p).nome() << endl << (*p).número() << endl;}

Page 25: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos25

Ponteiros e classes (II)

Em vez de

cout << (*p).nome() << endl << (*p).número() << endl;

usar abreviaura

cout << p->nome() << endl << p->número() << endl;

Page 26: 1 Aula 4 Ponteiros. 2003/2004 Programação Orientada para Objectos 2 Instâncias de um programa C++ int i = 10; Nome: i Tipo: int Valor: 10.

2003/2004 Programação Orientada para

Objectos26

Aula 4: Sumário

Instâncias de um programa C++: Memória Unidade básica de memória Endereço

Ponteiros Definição Inicialização Acesso indirecto a variáveis Símbolos * e & em declarações e expressões Relação com matrizes Relação com classes