谁能教教我pascal语言中的指针如何进行实际运用?

作者&投稿:毛弯 (若有异议请与网页底部的电邮联系)
pascal语言中什么是指针?~

朋友!!!到书店或者网上买本pascal程序设计的书吧

11.1 指针

指针是通过地址来访问变量的一种特殊的数据类型,属于动态的数据结构,它可以在需要时产生,用完后则又可以取消或回收,以减少占用的内存空间。指针变量与其他类型的变量不同,它占有的不是数据,而是地址。
由于动态数据结构的变量是在程序执行过程中动态生成的,所以不能预先予以说明,无法预先给这些变量起名字,访问时也无法通过名字直接输出或显示,而只能用指针得到其地址,然后间接访问。

1、定义指针类型
在Turbo Pascal中,指针变量用来存放某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下:
类型名=^基类型名;
例如:type q=^integer;
var a,b,c:q;
说明:q是一指向整型存储单元的指针类型,其中"^"为指针符。a,b,c均定义为指针变量,分别可以指向一个整型存储单元。
上例也可用变量说明为:
var a,b,c:^integer;
指针也可以指向有结构的存储单元。
例如:type person=record
name:string[10];
sex:(male,female);
age:20..70
end;
var pt:^person;
pt为指向记录类型person的指针变量。
2、动态变量
应用一个指针指向的动态存储单元即动态变量的形式如下:
指针变量名^
例如:p^、q^、r^
指针变量p和它所指向的动态变量p^之间有如下关系:
以下语句把整数5存放到p所指向的动态变量p^中去:
p^:=5;
以下语句把p所指向的p^中的值赋给整型变量i:
i:=p^;
如果指针变量p并未指向任何存储单元,则可用下列赋值语句:
p:=nil;
其中nil是保留字,表示“空”,相当于C语言里面的null

3、对动态变量的操作
在Turob Pascal程序中,动态变量不能由var直接定义而是通过调用标准过程new建立的。过程形式为:
new(指针变量名);
如果有下列变量定义语句:
var p:^integer;
仅仅说明了p是一个指向整型变量单元的指针变量,但这个整型单元并不存在,在指针变量p中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元,并把这个单元的地址放在变量p中,一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在p中,从而丢失了旧的变量单元的地址。
为了节省内存空间,对于一些已经不使用的现有动态变量,应该使用标准过程dispose予以释放。过程形式为:dispose(指针变量名);为new(指针变量名)的逆过程,其作用是释放由指针变量所指向的动态变量的存储单元。例如在用了new(p)后在调用dispose(p),则指针p所指向的动态变量被撤销,内存空间还给系统,这时p的值为 nil。

4.需要注意之处
1、P与P^的区别
P是指向该动态变量的指针变量名,P^则称为动态变量或标志变量。P的值是P^的首地址,P^的值为与基类型相同的一个值。
2、定义后及时分配存储单元
定义了一个指针变量后,并没有为该指针分配动态存储单元,此时的P的值无定义,调用P^则会产生运行错误。若想使该指针可用,可以对指针赋值,也可以通过NEW()过程分配存储单元。
3、使用后及时收回存储单元
指针使用后,不会自动归还占用的存储空间,应及时使用DISPOSE()过程来释放P^所占用的存储单元,以免浪费有限的存储空间.

11.2 单链表

单链表的数据类型可定义如下:

type dlb=^node;

node=record

data:datatype;

next:dlb;

end;

例1 连续输入一序列整数,组成链表(并以动态的形式把它们记录下来),当输入的数为-1时,停止输入,然后把输入的整数按相反的顺序输出.

program lianbiao;
type link=^data;
data=record
num:integer;
next:link;
end;
var p,q:link;
i:integer;
begin
q:=nil;
readln(i);
while i-1 do

begin

new(p);
with p^ do
begin
num:=i;
next:=q;
end;
q:=p;
readln(i);

end;
while pnil do
begin
write(p^.num:6);
p:=p^.next;
end;
readln;
end.

练习:将例1中如果数据不按现反的顺序(按输入时的顺序)输出时,怎样建表.(程序)

上述建表方式其实就是分别从表头和表尾插入元素,下面是从表中插入元素;

例2:输入若干整数(输入32767停止输入)排序(小到大)输出之。

program lianbiao;
type link=^data;
data=record
num:integer;
next:link;
end;
var head,p,q,r:link;
i:integer;
begin
head:=nil;
readln(i);
while i32767 do
begin
new(p);
p^.num:=i;
p^.next:=nil;
if head=nil then begin head:=p;end
else
begin
q:=head;
if p^.num<q^.num then begin head:=p;p^.next:=q end else
begin
while (p^.num >=q^.num) and (qnil) do begin r:=q ;q:=q^.next;end;
if q=nil then r^.next:=p else begin r^.next:=p;p^.next:=q end
end;
end;
readln(i);
end;
p:=head;
while pnil do
begin
write(p^.num:6);
p:=p^.next;
end;
readln;
end.

pascal语言中指针类型和动态数据结构

整型、实型、布尔型等各种简单类型和数组、记录、集合等各种结构类型的数据都属于静态类型的数据。所谓静态类型数据是指使用前必须在程序的说明部分给出描述这种数据的类型说明(TYPE语句)或变量说明(VAR语句),以定义这类数据占用内存空间的大小规模,使系统在程序的编译阶段能对这些变量进行内存空间的分配,空间一旦分配则不能在程序的执行过程中加以改变。现在讨论另一种类型的数据,这些数据和静态类型数据不同,它们无需在程序的变量说明部分对其进行说明,也就是系统在程序编译阶段不对这些变量分配内存空间,而是在程序的运行过程中根据需要用相应的命令动态地建立、分配内存空间,以至这种类型的数据占用内存空间的大小规模可以动态地发生变化,故称之为动态类型数据结构。

一、指针变量以及动态数据的产生

讨论动态类型数据是如何在程序的运行阶段动态地建立起来的,就要讨论与之有关的一种静态类型数据 指针。

指针类型属于静态的简单类型,但和整型、实型、字符型这些简单类型不同。首先整型、实型、字符型的变量单元中存放的是相应类型的数据,而指针类型变量单元中存放的是某种类型变量单元的地址,通过该地址可以找到这种类型的数据,所以称它是一个指针,而这种数据就是动态数据;其次整型、实型、字符型等类型都有规定的标准标识符integer、real、char等与之对应,而指针类型则没有相应的标准标识符。这是因为在动态数据产生的过程中,程序员关心的是指针指向一个什么类型的数据。所以,在Pascal程序说明部分定义指针类型时必须给出该指针类型变量所指向的数据类型,即该指针类型标识何种类型的变量。

如在程序的类型说明部分有:

TYPE

pint=^integer;

pre=^real;

表明程序定义了两种指针类型pint和pre。pint用于标识整型的变量,pre用于标识实型的变量。

若在程序的变量说明部分有指针类型变量的说明:

VAR p1,p2:pint;

q:pre

表明程序定义了三个指针变量,p1和p2是pint类型的变量,q是pre类型的变量。在程序的编译阶段,同其它简单变量(整型、实型、字符型等)一样,系统要给它们分配空间,这就是前面所说的指针变量是静态变量。在内存空间分配之初,p1、p2和q变量单元还未定义,此时指针变量不指向任何一个内存变量单元,因为所需指向的动态数据单元还未产生,它们是在程序运行过程中利用p1、p2和q变量以及new过程语句动态地产生的。一旦有动态数据产生,则p1、p2变量单元中将存放动态产生的整型变量单元的地址,q变量单元中将存放动态产生的实型变量单元的地址。

动态数据的产生是系统在程序运行阶段执行过程语句new(<指针变量名>)时进行,所产生的动态数据单元用:“<指针变量名>^” 来命名:

new(p1):系统动态地产生整型变量单元,即动态地给一个整型变量分配内存单元,并将该单元的地址放入p1单元中。该整型变量单元命名为p1^,表明通过p1指针可访问这个单元的整型数据。

new(q):系统动态地产生实型变量单元,即动态地给一个实型变量分配内存单元,并将该单元地址放入q单元中。该实型变量单元命名为q ^,表明通过q指针可访问这个单元的实型数据。

二、指针类型变量的应用以及动态数据的操作

下面讨论指针类型变量的应用,即如何将整型数据或实型数据等存放到动态产生的相应的内存变量单元中,并对这些单元进行必要的操作。

首先可以用赋值语句将一个指针变量的地址值赋给另一个指针变量,如:

p2:=p1,表示将p1单元的地址值赋给p2,此时p2单元的内容也是指向某整型变量单元的地址值。

但p1:=q不行,因为在定义中可见两指针类型所标识的类型变量不同。

下面通过一个简单的例子看指针类型变量的应用:

PROGRAM EX00(OUTPUT);

TYPE

pint=^integer;

pre=^real;

VAR p:pint;

q:pre;

BEGIN

NEW(p);

p^ :=3;

NEW(q);

q^ :=4.5;

q^:=q^* p^;

WRITELN(q^);

DISPOSE(p);DISPOSE(q)

END.

最后语句DISPOSE(p)以及DISPOSE(q)为释放由p和q指针所指向的变量单元。

指针类型变量所指向的数据类型可以是整型,实型,字符型等简单类型,也可以是数组、集合、记录等结构类型。推而广之就有了链表、树结构等的产生及其应用。

如在程序说明部分有链表定义:

TYPE

Lp=^Litem

Litem=RECORD

int:integer;

next:Lp

END;

在该定义中,定义了指针类型Lp,用于标识Litem记录类型的变量。但我们注意到,在定义指针类型Lp时,Litem尚未定义,它的定义是在Lp的定义之后给出的。这种先使用后定义的情况在以上的链表定义中是允许的。

若在程序变量说明部分有:

VAR

L:Lp

则变量L 为一指针类型变量。在程序运行中,它的值将是一动态产生的记录型变量单元的首地址,即L 是指向记录型数据的指针变量。

若在程序中有:

new(L):系统动态地产生记录型变量单元,即动态地给一个记录型变量分配内存单元,并将所分单元的首地址放入L单元中。分配的记录型变量命名为L^,该记录型变量L^有两个域,一是整型数据域L^.int,一是指向另一记录型变量的指针域L^.next。

new(L^.next):同上,系统动态地给一个记录型变量分配内存单元,并将所分单元的首地址放入L^.next单元中。分配的记录型变量命名为L^.next^,该记录型变量L^.next^ 同样有两个域,一是整型数据域L^.next^.int,一是指向另一记录型变量的指针域L^.next^.next。

接下来还可有new(L^.next^.next),new(L^.next^.next^.next)……,一个链表数据结构就随之产生了。但因为链表是一个动态数据结构,它的长度,即链表结点的个数是不可预测的,所以不可能用以上的语句来产生链表的各结点。在以下产生整型单链表的程序中,使用了一个跟踪指针L,用循环的方法产生一个单链表:

PROGRAM EX01(INPUT,OUTPUT);

TYPE

Lp=^Litem;

Litem=RECORD

int:integer;

next:Lp

END;

VAR

head,L:Lp; i:integer;

BEGIN

NEW(head);L:=head; i:=1;

WRITE('请输入第',i,'结点值:');

READLN(L^.int);

WHILE not eof DO

BEGIN

i:=i+1;

NEW(L^.next);L:=L^.next;

WRITE('请输入第',i,'结点值: ');

READLN(L^.int)

END;

L^.next:=nil;

(*以上为单链表的产生,以下为单链表的输出*)

L:=head;

WHILE L^.next<>nil DO

BEGIN

WRITELN(l^.int);

L:=L^.next

END

END.


为什么需要计算机语言?高级语言的特点?
(1)解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。 (2)编译类:编译是指在应用源程序执行之前,就...

有哪些数学名人?
约翰·冯·诺依曼 ( John Von Nouma,1903-1957),美藉匈牙利人,1903年12月28日生于匈牙利的布达佩斯,父亲是一个银行家,家境富裕,十分注意对 孩子的教育.冯·诺依曼从小聪颖过人,兴趣广泛,读书过目不忘.据说他6岁时就能用古 希腊语同父亲闲谈,一生掌握了七种语言.最擅德语,可在他用德语思考种种设想时,又能以...

大学生计算机个人求职信
我是新华学校的一名应届毕业生,在校期间,我勤奋努力学习,成绩优异,多次获学校学金,掌握了windows、c语言、pasca、,数据结构、数据库原理等专业基础知识。同时,通过大量的实际操作,我熟练掌握了dos,windows操作系统,并对unix有一定的了解,能够独立word、excel、photoshop等应用等软件,有一定的语言编程基础,在经济信息及计...

栾姓来历?
受汝启蒙,老子留书,孔孟之道,后世相传,栾氏精英,历代不断,栾书栾布,吾祖圣贤,辅国为政,后人颂赞,能人辈出,后继不断,感念祖荫,正娟怀念,敬仰先人,悟道修炼,尘世练心,上善若水,人称道名,悟尘上人,继先人志,忧天下难,身行教化,倡导善言

数学文化的呈现的途径主要有哪些
)在爬山的年代里,帕斯卡受到冉森教派(一个强烈反耶稣会的天主教教派)的影响。1654年,有一次他的驾车的马惊跑,他几乎送命。他把这件事解释为神不悦的证据,于是他更坚决地改宗,这就促使他把短暂的受疾病折磨的余生献给沉思默想、禁欲主义及宗教著述【包括他著名的Pensees(《思想录》)],,这些著作才华横溢使...

计算机专业毕业生自荐书
您好!我叫,感谢您在百忙之中查看我的求职信。我是新华学校的一名应届毕业生,在校期间,我勤奋努力学习,成绩优异,多次获学校学金,掌握了windows、c语言、pasca、,数据结构、数据库原理等专业基础知识。同时,通过大量的实际操作,我熟练掌握了dos,windows操作系统,并对unix有一定的了解,能够独立Word、Excel、 Photoshop等...

上甘岭区17034554639: 谁能教教我pascal语言中的指针如何进行实际运用?
衷鲍甲苯: pascal语言中指针类型和动态数据结构 整型、实型、布尔型等各种简单类型和数组、记录、集合等各种结构类型的数据都属于静态类型的数据.所谓静态类型数据是指使用前必须在程序的说明部分给出描述这种数据的类型说明(TYPE语句)或...

上甘岭区17034554639: 谁能教我pascal的指针 -
衷鲍甲苯: 怎么说呢.平常的变量里面都是数值,指针是地址而不是具体的数值.举例来说吧.变量呢是一个房间的号码,这个里面有多少人.查看这个房间就可以了.但指针不行.虽然你看到也是用房间号码表示出来的.但实际是查看房间的时候看不到有多少人.而是看到的另外一个房间的号码.通过这个号码找到那个房间,才有可能看到房间里有多少人.不知道这样说你能否听懂,实在不行可以联系我.学过好久了.也许有些小错误.不过我想应该没错的,当初我理解还算比较号

上甘岭区17034554639: pascal的指针 -
衷鲍甲苯: 简单些是这样理解的.指针就像是带有地址的变量,它不会直接给你数据,而是给你数据所在的地址.这样插入和删除互不影响,具有动态的效果.而数组储存位置是必须相邻的. 由指针构成的单向数据结构就是链表,一对多是树,多对多是图,原理差不多,都属于数据结构…嗯…扯远了

上甘岭区17034554639: Pascal 详解"指针类型" -
衷鲍甲苯: 第十一章 指针类型 11.1 指针 11.2 单链表 11.1 指针 指针是通过地址来访问变量的一种特殊的数据类型,属于动态的数据结构,它可以在需要时产生,用完后则又可以取消或回收,以减少占用的内存空间.指针变量与其他类型的变量不同,它占...

上甘岭区17034554639: turbo pascal中"指针"是什么东东? -
衷鲍甲苯: 指针即地址,它标识着一块内存空间.通俗的讲它就相当于你的房间号一样,通过它,我能找到你的房间,从而找到你这个人.比如:char a[10];a就是一个指针,它标识了这个数组的首地址.通过这个地址,就能找到在这个地址空间的元素.A-》B设这就是有两个原素的链表,A内有一个针指,指向B的地址空间.通过这个针指,就能找到B的内容.

上甘岭区17034554639: PASCAL指针
衷鲍甲苯: 简单的说.拿定义一个指针q来说吧. var q:^longint; 意思是定义一个存长整型数的指针; new(q)的意思是给指针q赋一个地址,如果不执行这一步的话,q的地址为NIL. 最后还要注意的是q的值是指针q的地址,q^的值是指针所指地址的内容或数据,也就是我们存的东西!

上甘岭区17034554639: pascal的.指针类型指针类型啊,帮帮我啊
衷鲍甲苯: program transfer(output); var a,b,c:^integer; begin new(a); a^:=100; new(b); b^:=200; new(c); c^:=50; a^:=b^; b^:=c^; c^:=a^; writeln(a^:5,b^:5,c^:5); dispose(a); dispose(b); dispose(c); readln; end. 运行结果:200 50 200

上甘岭区17034554639: 关于PASCAL指针的基础问题 -
衷鲍甲苯: 指针嘛,可以说在NOIP范围内很少能真正上战场,即使用到也不过是填填空,说说特征罢了 指针的好处很简单,因为是动态分配的,也可以释放,比较省空间,实际上,有一些搜索强题,即使再怎么优化空间也还是会有爆的可能,这种情况下...

上甘岭区17034554639: 有关pascal指针的问题 -
衷鲍甲苯: 最基本的指针运用啊,我初赛前10分钟刚刚看得指针都会做这题...答案是bcd,教你一个白痴但很有用的方法,rlink就是右指针,llink就是左指针,加个^就是指其所指的地址,你可以把他当做一个数来看.B的意思就是p的左的右赋成p的右,p的右的左赋成p的左,dispose是删除某个地址的令命,即把p所指的地址的空间释放,等于删除p,这样b就是正确的,cd两个自己推,a很明显是错的(p的右的左赋成p的右,明显反了).

上甘岭区17034554639: PASCAL语言中有哪些常用函数? -
衷鲍甲苯: PASCAL中,保留字分为6种共36个: (1)程序、函数、过程符号 program,function,procedure (2)说明部分专用定义符号 array,const,file,label,of packed,record,set,type,var (3)语句专用符号 case,do,downto,else,for,forward,goto,if,repeat,then,to ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网