Presentation is loading. Please wait.

Presentation is loading. Please wait.

PASCAL 语言 吉林大学计算机科学与技术学院. 第十一章 指针 指针的由来 指针的定义 PQ.

Similar presentations


Presentation on theme: "PASCAL 语言 吉林大学计算机科学与技术学院. 第十一章 指针 指针的由来 指针的定义 PQ."— Presentation transcript:

1 PASCAL 语言 吉林大学计算机科学与技术学院

2 第十一章 指针

3 指针的由来

4 指针的定义 PQ

5 指针类型的定义 TYPE ip=^integer; ip=^integer; ip=^real; ip=^real; cp=^char; cp=^char; ap=^array[1..10] of char;( 错误 ) ap=^array[1..10] of char;( 错误 ) rep=^record rep=^record s:array[1..10] of char; s:array[1..10] of char; t:real; t:real; end; end;

6 指针变量的定义 VAR a : ip ; a : ip ; b : rp; b : rp; c:rep; c:rep; d:integer; d:integer; 指针类型不申请空间,变量才分配空间 指针变量只能保存内存地址,而不能存入具体内容 d:=1;a:=addr(d);write(a^);a^:=2;write(d);

7 指针只能指向对应类型 Var p:^integer; p:^integer; i : integer; i : integer; j:char; j:char;Begin p:=addr(i); p:=addr(i); p:=addr(j); p:=addr(j);End.

8 New 和 Dispose 以及 NIL Var p:^integer; p:^integer;Begin new(p); new(p); p^:=1; p^:=1; write(p^); write(p^); dispose(p); dispose(p); p:=NIL; (可以对应所有类型) p:=NIL; (可以对应所有类型) write(p^); (错误) write(p^); (错误)End.

9 指针变量访问的典型错误 Var p:^integer; p:^integer;Begin p^:=1; p^:=1;End.

10 指针举例 Type intptr=^integer; Var p1,p2:intptr; i:integer; i:integer; For i:=1 to 3 do Begin new(p1);p1^:=100; new(p1);p1^:=100; new(p2);p2^:=200; new(p2);p2^:=200; case I of case I of 1:; 1:; 2:p2:=p1; 2:p2:=p1; 3:p2^:=p1^; 3:p2^:=p1^; end; end; write(I,’:’); write(I,’:’); if p1=p2 then writeln(‘p1=p2’) else writrln(‘p1<>p2’); if p1=p2 then writeln(‘p1=p2’) else writrln(‘p1<>p2’); if p1^=p2^ then writeln(‘p1^=p2^’) else writrln(‘p1^<>p2^’); if p1^=p2^ then writeln(‘p1^=p2^’) else writrln(‘p1^<>p2^’);End.

11 开域语句 WITH 与指针关系 Type pp=record aa:char; aa:char; bb:integer; bb:integer; name:string ( 8 ) ; name:string ( 8 ) ; end; end; ppp = ^pp ; ppp = ^pp ; Var p1,p2:ppp; new(p1); new(p2); p1^.aa:=‘A’; p1^.aa:=‘A’; readln(p1^.name); readln(p1^.name); with p1^ do with p1^ do begin begin bb:=1; bb:=1; p1:=p2; p1:=p2; bb=1; bb=1; end; end;

12 链表的由来 (1) Type pp=record a:char; b:integer; c:real ; end; ppp=^pp; ppp=^pp;var a,b,c,d:pp; a,b,c,d:pp; new(a); new(b); new(c); new(d); new(a); new(b); new(c); new(d);

13 链表的由来 (2) Type pp=record a:char; b:integer; c:real ; end; ppp=^pp; ppp=^pp; var a:array[1..30] of pp; I,j:integer; Read(j); For i:=1 to j do new(a[i]); For i:=1 to j do read(a[i]^.a,a[i]^.b,a[i]^.c);

14 链表的由来 (3) a b c a b c a b c a b c Type ppp=^pp; pp=record pp=record a:char; a:char; b:integer; b:integer; c:ppp ; c:ppp ; end; end;

15 Var h,o,p:ppp; New(h); O:=h; For i:=2 to j do begin o^.c:=new(p); o^.c:=new(p); o:=o^.c; end; o:=o^.c; end;O^.c:=NIL; a b c a b c a b c NIL H OP 链表的创建

16 P:=h ; While p<>NIL do begin begin p^.a:=pred(p^.a); p^.b:=1; p^.a:=pred(p^.a); p^.b:=1; p:=p^.c; p:=p^.c; end; end; 链表的访问

17 P:=h ; While p<>NIL and p^.a<>’A’ do p:=p^.c; p:=p^.c; writeln(p^.b); writeln(p^.b); 链表的查找 P:=h ; While p<>NIL and p^.a<>’A’ do begin begin q:=p; p:=p^.c; q:=p; p:=p^.c; end; end; writeln(q^.b); writeln(q^.b);

18 P:=h ; While p<>NIL and p^.a<>’A’ do p:=p^.c; p:=p^.c; q^.c:=p^.c; q^.c:=p^.c; p^.c:=q; p^.c:=q; 链表的插入 a b c a b c a b c NIL a b c p q

19 P:=h ; While p<>NIL and p^.a<>’A’ do p:=p^.c; p:=p^.c; q:=p^.c; q:=p^.c; p^.c:=q^.c; p^.c:=q^.c;Dispose(q); 链表元素的删除 a b c a b c a b c NIL pq

20 TYPE items=… TYPE items=… pointer = ^stackcell ; pointer = ^stackcell ; stackcell = RECORD stackcell = RECORD data : items ; data : items ; predocessor : pointer predocessor : pointer END ; END ; 栈的定义及初始化 data predecessor NIL top Var top:pointer; PROCEDURE stackinitial ; BEGIN BEGIN top:=NIL top:=NILEND;

21 PROCEDURE stackpush ( x:iterms ) ; VAR p:pointer; VAR p:pointer; BEGIN new(p); BEGIN new(p); p↑.data := x ; p↑.data := x ; p↑.prodocessor := top ; p↑.prodocessor := top ; top := P top := P END; END; 进栈 data predecessor data predecessor data predecessor NIL top

22 PROCEDURE stackpop ( VAR x:iterms ) ; VAR P:pointer; VAR P:pointer; BEGIN BEGIN IF top <> NIL IF top <> NIL THEN THEN BEGIN BEGIN x := top↑.data ; x := top↑.data ; p := top ; p := top ; top := top↑.predecessor ; top := top↑.predecessor ; dispose(p) dispose(p) END END ELSE writeln( ' 栈下溢 ' ) ELSE writeln( ' 栈下溢 ' ) END; END; 出栈 data predecessor data predecessor NIL top p


Download ppt "PASCAL 语言 吉林大学计算机科学与技术学院. 第十一章 指针 指针的由来 指针的定义 PQ."

Similar presentations


Ads by Google