A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal: var.

Apresentações semelhantes


Apresentação em tema: "Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal: var."— Transcrição da apresentação:

1 Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal: var ptInt: ^integer; {ponteiro para uma variável inteira } ptReal: ^real; {ponteiro para uma variável real}

2 Operador unário que obtém o endereço de uma variável program soma; var S,A,B:integer; PtS,PtA,PtB : ^integer; begin readln(A,B); PtA PtB PtS PtS^ := PtA^ + PtB^; writeln('Resultado: ',PtS^); end.

3 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A B PtA S PtB PtS

4 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B PtA S PtB PtS

5 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B3 PtA S PtB PtS

6 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B3 PtA S PtB PtS

7 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B3 PtA S PtB PtS

8 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B3 PtA S PtB PtS

9 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B3 PtA S 5 PtB PtS

10 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA PtB PtS PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. Alocação de memória A 2B3 PtA S 5 PtB PtS 5

11 procedure New( ) Cria dinamicamente (em tempo de execução) uma nova variável e faz uma variável ponteiro apontar para ela. type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

12 type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. Alocação de memória P

13 type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. Alocação de memória P

14 type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. Alocação de memória P Bom Dia!

15 type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. Alocação de memória P Bom Dia!

16 type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. Alocação de memória P OBS: a procedure Dispose libera uma variável criada dinamicamente. Se isso não for feito, a região de memória disponibilizada não poderá ser usada até que o computador seja reiniciado.

17 Outras situações comuns Um ponteiro recebendo o endereço de um outro: var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^); { ou q^ ou, ainda, r^ } dispose(q^); { ou p^ ou, ainda, r^ } :

18 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^ } : Alocação de memória p q r

19 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^ } : Alocação de memória p q r

20 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^ } : Alocação de memória p q r 5

21 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^ } : Alocação de memória p q r 5

22 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^ } : Alocação de memória p q r 5

23 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^ } : Alocação de memória p q r 5

24 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^ } : Alocação de memória p q r 5 5

25 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^ } : Alocação de memória p q r ATENÇÃO: observe que a partir de q:=p;, perdeu-se o acesso à variável criada com new(q); Portanto, o manuseio de ponteiros exige cuidado!

26 Listas encadeadas Em várias situações em programação temos que lidar com listas de elementos cujo tamanho exato é desconhecido. Soluções: Empregar um agregado homogêneo (array) superdimensionado N-1N Empregar seqüências de células (nós) que contêm dois elementos: um valor e um ponteiro para o próximo nó.... p /

27 Quando adotar uma ou outra solução? Agregado homogêneo: quando pudermos determinar com segurança o tamanho máximo. Listas encadeada: - quando for difícil estimar o tamanho máximo com segurança; e/ou... - quando se desejar maior agilidade nas inclusões ou exclusões de novos elementos.

28 Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. p / / p Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil) OBS: o ponteiro contido no primeiro nó aponta para a lista formada pelos demais nós

29 Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. p / / p Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil) OBS: para se ter acesso aos elementos da lista é necessário que haja sempre uma variável ponteiro apontando para a cabeça da lista (primeiro elemento)

30 Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. p / / p Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil) A partir de cada nó, pode-se ter acesso ao seguinte. Assim, pode-se percorrer a lista toda.

31 Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. p / / p Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil) Quando a lista estiver vazia o ponteiro que deveria apontar o primeiro elemento, guarda o valor nil ( / ).

32 Definição (recursiva) de um nó: type tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo; OBS: no início da execução do programa só há ponteiros ( p,q ) para nós. Estes poderão, dinamicamente, ser empregados para se construir uma lista.

33 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Exemplo de uso: criação de uma lista com dois elementos: p^.Dado acesso ao objeto apontado por p acesso ao campo específico

34 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Exemplo de uso: criação de uma lista com dois elementos: p^.Prox acesso ao objeto apontado por p acesso ao campo específico

35 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q

36 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q

37 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q 7

38 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q 7

39 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q 7 3

40 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q 7 3

41 var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : Alocação de memória p q 7 3/

42 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Exemplo 2: dada a lista abaixo, inserir um novo nó entre os dois existentes e armazenar nele o valor 2. p 7 3/ q

43 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q

44 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q

45 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q 2

46 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q 2

47 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q 2

48 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q / 2

49 : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : Alocação de memória p 7 3/ q / 2

50 Manuseio de listas encadeadas Para tratar de forma genérica todas as possíveis manipulações de uma lista encadeada, é definido um conjunto de rotinas. Exemplos: inserir/excluir um elemento no início inserir /excluir um elemento no final inserir /excluir um elemento na enésima posição calcular a soma dos elementos

51 Exemplo: inserir elemento V no final Duas situações a se considerar: Lista vazia Lista com 1 ou mais elementos p / / p...

52 Para lista vazia: / p : new(p); p^.Dado:=V; p^.Prox:=nil;

53 : new(p); p^.Dado:=V; p^.Prox:=nil; Alocação de memória p V 5

54 : new(p); p^.Dado:=V; p^.Prox:=nil; Alocação de memória p V 5

55 : new(p); p^.Dado:=V; p^.Prox:=nil; Alocação de memória p V 5 5

56 : new(p); p^.Dado:=V; p^.Prox:=nil; Alocação de memória p V 5 5 /

57 Para lista não vazia: : { fazer q apontar para o último elemento } q:= p; while q^.Prox <> nil do q:=q^.Prox; { inserir o novo elemento } new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; p 4 7 1/

58 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

59 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

60 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

61 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

62 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

63 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

64 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

65 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5

66 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5 5

67 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 / q 2 r V 5 5 /

68 : q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; Alocação de memória p 7 3 q 2 r V 5 5 /

69 Juntando as duas situações... procedure InsereNo(var p: tPtNo; V : tDado); var q,r: tPtNo; begin new(r); r^.Dado:=V; r^.Prox:=nil; if p = nil then p:= r else begin q:= p; while q^.Prox <> nil do q:=q^.Prox; q^.Prox:=r; end; Como existe a possibilidade de p mudar seu conteúdo, ele é passado por referência.


Carregar ppt "Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal: var."

Apresentações semelhantes


Anúncios Google