Escolar Documentos
Profissional Documentos
Cultura Documentos
Variveis ponteiros so aquelas que guardam o endereo de outra, possibilitando o acesso a seu contedo. Declarao em Pascal:
var ptInt: ^integer; {ponteiro para uma varivel inteira } ptReal: ^real; {ponteiro para uma varivel real}
1
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
B 3
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
B 3
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
B 3
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
B 3
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
B 3
S 5
Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.
PtA
PtB
PtS
A 2
B 3
S 5
10
procedure New( )
Cria dinamicamente (em tempo de execuo) uma nova varivel e faz uma varivel ponteiro apontar para ela.
type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.
11
Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.
12
Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.
13
Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.
Bom Dia!
14
Alocao de memria Bom Dia! type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.
Bom Dia!
15
Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.
OBS: a procedure Dispose libera uma varivel criada dinamicamente, para que o SO possa reutilizar o espao de memria correspondente.
16
17
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
18
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
19
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
20
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
21
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
22
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
23
Alocao de memria 5
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
24
Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
25
Alocao de memria ATENO: observe que a partir de q:=p;, perdeu-se o acesso varivel criada com var new(q)... p,q,r: ^integer; Portanto, o manuseio de ponteiros begin exige cuidado! new(p); p^ := 5; new(q); p r q q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :
26
Listas lineares
Em vrias situaes em programao temos que lidar com listas de elementos cujo tamanho exato desconhecido. Estratgias: Empregar um agregado homogneo (array) superdimensionado.
1 2 3
...
N-1 N
Empregar seqncias de clulas (ns) que contm dois elementos: um valor e um ponteiro para o prximo n.
p
...
27
Quando adotar uma ou outra soluo? Agregado homogneo: quando pudermos determinar com segurana o tamanho mximo. Listas encadeada: - quando for difcil estimar o tamanho mximo com segurana; e/ou... - quando se desejar maior agilidade nas incluses ou excluses de novos elementos.
28
inteiros.
Lista vazia / p
inteiros.
Lista vazia / p
inteiros.
Lista vazia / p
inteiros.
Lista vazia / p
Definio (recursiva) de um n:
type tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;
34
Definio (recursiva) de um n:
type tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;
35
type dinamicamente, ser empregados tDado = integer; { ou real, char, etc.} para se construir uma lista. tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;
Definio (recursiva) de um n: OBS: no incio da execuo do programa s h ponteiros (p,q) para ns. Estes podero,
37
p^.Dado
38
p^.Prox
39
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
40
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
41
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
42
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
43
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
44
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
45
Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :
3 /
46
Exemplo 2: dada a lista abaixo, inserir um novo n entre os dois existentes e armazenar nele o valor 2.
: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : p q
3 /
47
Alocao de memria
3 /
48
Alocao de memria
3 /
49
Alocao de memria
2 7 3 /
50
Alocao de memria
2 7 3 /
51
Alocao de memria
2 7 3 /
52
Alocao de memria
q / 2
3 /
53
Alocao de memria
OBS: por convenincia, representamos esquematicamente os ns lado a lado. : Entretanto, as suas localizao no heap new(q); podem ser bastante dispersas... q^.Dado := 2;
q^.Prox := p^.Prox; p^.Prox := q; q := nil; : 7 p q /
3 /
54
p q
7 2
h e a p
...
55
Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new?
56
Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new? No. >> o simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele.
57
Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new? No. >> o simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele. >> new() deve ser usado para criar um objeto (sem identificao) para o qual o ponteiro usado como argumento apontar.
58
Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new? No. >> o simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele. >> new() deve ser usado para criar um objeto (sem identificao) para o qual o ponteiro usado como argumento apontar. >> o tipo do objeto criado depender do tipo de ponteiro.
59
Dvidas freqentes:
Caso seja executado o cdigo abaixo, p. ex...
new(q); q:=p;{apontarparaoprimeiroelemento dalista}
3 /
60
Dvidas freqentes:
Caso seja executado o cdigo abaixo, p. ex...
new(q); q:=p;{apontarparaoprimeiroelemento dalista}
3 /
61
Dvidas freqentes:
Caso seja executado o cdigo abaixo, p. ex...
new(q); q:=p;{apontarparaoprimeiroelemento dalista}
3 /
62
Dvidas freqentes:
2) ao encerrar um mdulo, devo desalocar os ponteiros, empregando dispose?
63
Dvidas freqentes:
2) ao encerrar um mdulo, devo desalocar os ponteiros, empregando dispose? No. >> no encerramento do mdulo, todas as variveis locais e parmetros (inclusive ponteiros) so desalocados automaticamente.
64
Dvidas freqentes:
2) ao encerrar um mdulo, devo desalocar os ponteiros, empregando dispose? No. >> no encerramento do mdulo, todas as variveis locais e parmetros (inclusive ponteiros) so desalocados automaticamente. >> ao se utilizar dispose(r), o objeto referenciado por r que ser excludo. No o ponteiro em si.
65
Dvidas freqentes:
3) quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto?
66
Dvidas freqentes:
3) quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto? No. >> o n no pertence ao ponteiro que foi empregado na sua criao.
67
Dvidas freqentes:
3) quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto? No. >> o n no pertence ao ponteiro que foi empregado na sua criao. >> qualquer ponteiro que esteja apontando para certo objeto pode ser usado para a sua desalocao.
68
Dvidas freqentes:
4) ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo portanto aps a execuo daquele mdulo?
69
Dvidas freqentes:
4) ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo portanto aps a execuo daquele mdulo? No. >> o objeto criado alocado na rea de memria denominada heap (rea prpria para alocao dinmica).
70
Dvidas freqentes:
4) ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo portanto aps a execuo daquele mdulo? No. >> o objeto criado alocado na rea de memria denominada heap (rea prpria para alocao dinmica). >> variveis de heap no so nem globais nem locais.
71
Dvidas freqentes:
Atente bem: Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa.
72
Dvidas freqentes:
Atente bem: Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa. Variveis locais: seu tempo de vida o intervalo de execuo do mdulo onde foram declaradas.
73
Dvidas freqentes:
Atente bem: Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa. Variveis locais: seu tempo de vida o intervalo de execuo do mdulo onde foram declaradas. Variveis de heap: seu tempo de vida arbitrrio, dependendo de uma criao (new) e da posterior desalocao.
74
/ p
...
76
Alocao de memria V 5 p
77
Alocao de memria V 5 p
criar novo n
78
Alocao de memria V 5 p
79
Alocao de memria V 5 p
80
Alocao de memria V 5 p
guardar o valor de V
81
Alocao de memria V 5 p
82
Alocao de memria V 5 p
83
Alocao de memria V 5 p
caracterizar ltimo n 5
84
Alocao de memria V 5 p
85
Alocao de memria V 5 p
5 /
86
87
q 1 /
Condio facilitadora: fazer com que um ponteiro auxiliar aponte para o ltimo n...
88
Alocao de memria V 5 p q
:
q:= p;
3 /
89
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...
3 /
90
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...
3 /
91
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...
3 /
92
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...
3 /
93
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...
3 /
94
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ...? ... criar novo n ... ...
3 /
95
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); ... ... ...
3 /
96
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); ... ... ...
3 /
97
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); ...? ... guardar o ... valor de V
3 /
98
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; ... ...
3 /
99
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; ... ...
3 /
100
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; ...? ...
caracterizar ltimo n
3 /
101
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^Prox:=nil; ...
3 /
102
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; ...
3 /
5 /
103
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; ...?
ligar ns
3 /
5 /
104
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
3 /
5 /
105
Alocao de memria V 5 p q
:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
5 /
106
{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
107
observe as semelhanas...
{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
108
observe as semelhanas...
{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
109
observe as semelhanas...
{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
110
Como existe a possibilidade de p mudar seu contedo, ele passado por referncia.
111
112
p /
...
/
113
...
/
114
no h n anterior...
...
/
115
no h n anterior...
...
/
116
p /
...
/
117
p /
...
/
118
119
...ajustes necessrios:
procedure InsereNoFinal(var p:tPtNo; V: tDado); var q,r: tPtNo; begin new(r); r^.Dado:=V; r^.Dir:=nil; if p = nil then begin p:= r; r^.Esq:= nil; end; else begin q:= p; while q^.Dir <> nil do q:=q^.Dir; q^.Dir:=r; r^.Esq := q; end; end;
120
Exerccios (encadeamento simples e duplo): Construir mdulos que faam as seguintes operaes:
1- Inserir no incio da lista; 2- Excluir o primeiro elemento; 3- Excluir o ltimo elemento; 4- Inserir na ensima posio; 5- Excluir o ensimo n; 6- Fornecer o tamanho da lista 7- Fornecer a soma dos elementos da lista.
121
Orientaes...
1- Sempre pla neje antes de codi fi car . a) faa um esquema visual do problema! -> use lpis e borracha, pois os ponteiros so dinmicos...
122
Orientaes...
1- Sempre pla neje antes de codi fi car . a) faa um esquema visual do problema! -> use lpis e borracha, pois os ponteiros so dinmicos... b) ateno especial list a de parme tros : quais so os parmetros necessrios, seus tipos, mecanismo de passagem (valor ou referncia);
123
Orientaes...
c) procure identificar co ndie s fa ci li tadoras para a soluo de um problema. Por exemplo, para excluir o ensimo n, ser necessrio um ponteiro auxiliar apontando para ele.
p ... q
/
124
Orientaes...
c) procure identificar co ndie s fa ci li tadoras para a soluo de um problema. Por exemplo, para excluir o ensimo n,
...mas isso ser necessrio um ponteiro auxiliar ser suficiente?? apontando para ele. p ... q
/
125
Orientaes...
No. No processo de excluso, p. ex., do n que guarda o valor 8, ser necessrio encadear o anterior com o sucessor...
p ...
/
126
Orientaes...
Portanto a condio facilitadora pede tambm um ponteiro para o n anterior...
p ...
/
127
Orientaes...
Portanto a condio facilitadora pede tambm um ponteiro para o n anterior...
/
128
Orientaes...
...a identificao da condio facilitadora permite a diviso do problema em duas etapas, reduzindo-se a complexidade...
129
Orientaes...
2 - Primeiramente, procure a soluo para o caso mais geral. Depois considere as situaes especiais...
130
Orientaes...
2 - Primeiramente, procure a soluo para o caso mais geral. Depois considere as situaes especiais... Ex: Inserir na ensima posio: raciocinar para lista no vazia e insero no meio da lista. Depois considerar... - e se a lista estiver vazia? - e se a posio for a primeira (ou a ltima)? Quando a soluo geral no funcionar para esses casos, inserir o tratamento especial.
131