1 aula 4 ponteiros. 2003/2004 programação orientada para objectos 2 instâncias de um programa c++...
TRANSCRIPT
1
Aula 4
Ponteiros
2003/2004 Programação Orientada para
Objectos2
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.
2003/2004 Programação Orientada para
Objectos4
Memória
10
i: int
12 13 14 15
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.
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
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
2003/2004 Programação Orientada para
Objectos8
Memória
20
i: int
12 13 14 15
12
p: int*
24 25 26 27
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.
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;
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*
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;
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*
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;
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*
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;
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];
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;
}
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;
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);
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;
}
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]
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_;}
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;}
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;
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