中易网

关于PASCAL指针的基础问题

答案:3  悬赏:20  
解决时间 2021-03-11 18:03
我虽然已经学了一段时间的PASCAL .. 但是我从来不用指针. 也不会用..

现在想向大家请教一下 1.指针有什么好处.
2.指针经常用在什么地方(处理什么样的问题)处
3.有哪些指针基本语句(怎么用指针)

回答得好有加分(15分)

希望对指针的用法介绍的再详细一些!
最佳答案
指针嘛,可以说在NOIP范围内很少能真正上战场,即使用到也不过是填填空,说说特征罢了

指针的好处很简单,因为是动态分配的,也可以释放,比较省空间,实际上,有一些搜索强题,即使再怎么优化空间也还是会有爆的可能,这种情况下就要使用指针来省一省空间了
new()初始化指针变量,不过刚开始是乱指一气的,因此还是要赋一个值
dispose()释放指针变量
指针常量nil,给指针赋上此值指针将不指向任何值,经常在链表的表尾,或者二叉树的叶子节点使用
附:链表的建立
初始化head指针,指针域赋nil
然后每家入一个元素,就执行如下操作
new(p);new(q);
p^.data:=XXX;//数据域,填需要的数据
p^.next:=nil;
q^.next:=p;//迭代,从而完成表的建立
q:=p;

建立完以后执行p:=h;
然后
while p^.next<>nil do
begin
执行对该节点的操作;
p:=p^.next;
end;
从而完成遍历
全部回答
用@符号获取变量地址,如 
var 
i: integer; 
p: ^integer; 
begin 
i := 0; 
p :=@i; 
p^ := 1; 
writeln(i); 
end. 

至于指针的任意指向,首先一般的内存地址是用dword(0--4294967295),编号的可以先用一个dword类型的指针(q: ^dword)指向你需要赋值的指针变量,再通过修改q^来修改需要赋值的指针的值。这样就可以强行修改一个指针域。可以用同样的方法强行修改一个浮点数,集合,记录类型等..不过一搞不好就会崩溃的。 
var 
p: ^integer; 
q: ^dword; 
i: integer; 
begin 
i := 100; 
p := nil; 
q := @p; 
q^ := $409008; {在我的电脑上申变量i的地址是0040:9008} 
writeln(p^); 
end. 

下面的程序以十进制形式输出变量i的内存地址
var
 i: integer;
 p: ^integer;
 q: ^dword;
begin
 i := 1;
 p := @i;
 q := @p;
 writeln(q)
end;

这样可以获得i的内存地址。

以上程序都在freepascal上编译通过。
指针 指针是通过地址来访问变量的一种特殊的数据类型,属于动态的数据结构,它可以在需要时产生,用完后则又可以取消或回收,以减少占用的内存空间。指针变量与其他类型的变量不同,它占有的不是数据,而是地址。 由于动态数据结构的变量是在程序执行过程中动态生成的,所以不能预先予以说明,无法预先给这些变量起名字,访问时也无法通过名字直接输出或显示,而只能用指针得到其地址,然后间接访问。 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^所占用的存储单元,以免浪费有限的存储空间. 指针常用于链表。 单链表的数据类型可定义如下: 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 p<>nil do begin write(p^.num:6); p:=p^.next; end; readln; end. 不过更多时候,常用一维数组形式来代替指针定义链表数据结构: type jid=record data:datatype; next:integer; end; var alist=array[0..maxsize] of jid
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
请问北京最大的电脑软件市场在哪?
长沙县现在的小学英语教材是什么?
渤海保险客户服务中心地址在哪,我要去那里办
咸阳用什么上网好,比如电信,联通。。。。
佛说一切虚妄,为何有孽?有因果报应?
大话西游2 吸血符文1转70级可以用不` 急急急
2015年卡威w1还能卖多少
安徽高考分数线2016军医大的分数是多少
卡卡西厉害还是纲手厉害
昆山市进源汽车运输有限公司地址在什么地方,
简述复迭制冷的原理,它与一般的制冷有何区别
河北蔚县彩色剪纸用的是什么颜料
正宗沙县风味小吃在哪里啊,我有事要去这个地
对柳的特点分柝
求解谢了亲们
推荐资讯
有一首歌的歌词是无论啥事都一样瞅着英雄美军
深圳住房公积金提取额度是多少?在网站上看是
德祥汽车配件维修部这个地址在什么地方,我要
源汇区武汉铁路局信鸽协会漯河分会哪位知道具
IE6下网页布局全乱 IE7IE8正常css问题还是代
苹果平板电脑32g够用吗?
珠山区农林水务局在什么地方啊,我要过去处理
牛肉粉面馆在什么地方啊,我要过去处理事情
一首英文DJ歌。歌词里有put put put you
恩德地址在什么地方,想过去办事
中天快捷宾馆地址在什么地方,想过去办事
这个康熙通宝长这样 听说印错的钞票很值钱 那
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?