[帕斯卡尔 – TUT] – 帖子 11 : 在帕斯卡尔指针
做测序后应该有一点困惑 帖子 10: 文件类型 - 在帕斯卡文件 前面写, 你看 这里 NHE.
在工作的过程中,我们经常有一个长长的清单来工作,我们当然会考虑使用 板 马上. 然而,使用该阵列的不总是, 与长列表以几千元件, 员工在这样的大公司名单,因为没有足够的内存. 上,当我们声明数组另一方面,必须声明的元素数, 而我们之前不知道,当然,我们将不得不宣布最大的因素是能够工作,足以导致浪费内存或元素的数量不足被认为是不好的情况下如暂停=)).
静态变量 在尺寸可变的, 数据类型和变量的地址是恒定, 运行过程中,这些变量存在. 而在此之前,我们仍然使用静态变量, 这就是为什么浪费内存.运动 变量可以改变大小和存储器地址运行期间分配. 这就是我们的解决方案. 嘿嘿. 但问题是,波动是不是一个固定的地址不能被访问,直到它们.
指针 转化为含有挥发性的地址使得它的波动访问. 哇, 解决方案是在这里=)). 指针变量称为指针类型的数据类型.
现在,我们将进入指针的某些部分.
1. 定义游标的类型
句法:
Type <Kieu con tro> = <^Kieu du lieu>
例:
Type int = ^integer;
注意: 当定义光标指针型结构本身的类型 (自点式记录) 我们必须首先定义游标类型,然后定义记录的类型.
例:
Type ControSV = ^sinhvien; sinhvien = record MSV : string; Hoten : string; Diem : real; next : ControSV; end;
2. 声明游标变量
我们可以宣布直接或间接. 例如,类型和ControSV sinhvien看此选手可以声明
var sv1 : ControSV; {khai bao gian tiep} sv2 : ^sinhvien; {khai bao truc tiep}
此外,我们可以宣布的时候不关心数据的类型如下.
var p : pointer;
后声明指针变量p不是总指针超过一个特定的数据类型.
3. 分配内存变量.
我们注意到,指针变量是静态变量,它是计算机内存分配器 4 字节. 例如,为了开启SV1 SV1原样 1 指针, 它被分配的内存区域 4 ^ SV1新字节变量也出现波动,不分配. 也就是说,我们可以了解SV1指针包含波动SV1的地址^.
为SV1波动分配内存,我们使用new运算符(SV1);
NIL指针光标特别, 不指向无处. 指针由NILL的价值 0 或相应的空每种类型的游标.
4. 操作.
该. 任务
两个指针可以被分配给每个所述分配的 ( := ) 如果它们是同一类型. 在上面的例子中,我们可以将:
sv1 := sv2;
此外,我们还可以分配
p := sv1;
但不能分配的相反,因为光标指针p是一般类型.
我们可以指定任意值NIL指针公众.
B. 比较
我们只使用与类比 ( = ) 和其他的比较 ( <> ) 指针类型. 如果p和q光标指向一个移动的一个地址 (指向的变化) 他们被认为是相等, 相反会有所不同.
5. 将光标指向 1 变量
当我们有 1 整数类型的变量, 我会使用@操作指向指针p给一个变量的内存.
p := @a;
6. 检索数据
变量指针包含波动的地址,我们无法进入必须为波动做出直接的指针变量输入指向.
例如,在执行存取之后, 计算上的光标.
uses crt; var p : ^integer; a, s : integer; BEGIN clrscr; write('Nhap vao mot so (kieu con tro) p^ = '); new(p); readln(p^); write('Nhap vao mot so (kieu so nguyen) a = '); readln(a); s := 100*p^ + a; writeln('100p^ + a = : ', s); readln; END.
最大使用指针的像表示的前同步码, 创建阵列的链表代替. 在链接的列表中,您可以看到 这里, 很满, C语言详细,. (它像帕斯卡尔单独hehee).
这里是在进入和链表所示帕斯卡的文章.
Program DSLK; uses crt; type {dinh nghia kieu sinhvien} sinhvien = record MSV, Hoten : string; Diem : real; end; {dinh nghia Plist va list} Plist = ^list; list = record data : sinhvien; next : Plist; end; var first, last, newp : Plist; ch : char; i : integer; BEGIN clrscr; writeln('Danh sach sinh vien su dung con tro - danh sach lien ket'); writeln('-------------'); writeln; i := 0; repeat inc(i); new(newp); {cap phat o nho} with newp^.data do begin write('Nhap ma sinh vien thu ', i, ' : '); readln(MSV); write('Nhap ho ten : '); readln(Hoten); write('Nhap diem tong ket : '); readln(Diem); write('Tiep tuc ? (y/ n)'); readln(ch); ch := upcase(ch); end; if first = nil then {Gan phan tu dau tien} first := newp else {Gan phan tu cuoi cung} last^.next := newp; last := newp; {Cap nhat con tro last} last^.next := nil; until ch = 'N'; clrscr; writeln('Danh sach sinh vien su dung con tro - danh sach lien ket'); writeln('-------------'); writeln; newp := first; writeln('STT':5, ' | ', 'Ma sinh vien':20,' | ', 'Ho va ten' : 20,' | ', 'Diem':5); for i:= 1 to 50 do write('-'); writeln; i := 0; while newp <> nil do with newp^ do begin inc(i); writeln(i:5,' | ', data.MSV:20, ' | ', data.Hoten:20, ' | ', data.Diem:5:2); newp := next; end; readln; END.
输入数据:
结果:
文章或引用高
谢谢. 经常离线访问博客. ^^
服务员, 我问了一小, 两个变量SV1和SV1之间的差^如上他说, 他的解释是不是更接近?
SV1是正常的变变压器也是可变的指针^ SV1你啊. 现在你只需要了解变量,往往只变量的指针的区别. 往往求助于值保存为指针来保存地址.
chú ơi cháu muốn chèn 1 số vào cuối danh sách liên kết đơn mà sao k đc
procedure chencuoi( var l:ctr);
var q,P:ctr;
在,X:整数;
开始
新(q);
写(‘chen so x vao cuoi danh sach’); readln(q^.data);
P:=l;
在:= 1;
而(p nil) 的
开始
P:=p^.next;
inc(在);
比;
p^.next:=q;
比;
Anh ra thêm bài đi.
Vd như đồ họa trong pascal đó anh
Mình đang bận và chưa có thời gian, lúc nào rảnh mình sẽ viết. Cảm ơn bạn đã động viên nhé. 🙂
Anh ơi anh hướng dẫn lại cho em câu lệnh with…do được không anh
Em xem phần 3 của bài này nhé: https://cachhoc.net/2013/11/26/pascal-tut-bai-9-kieu-ban-ghi-record/
{dinh nghia Plist va list}
Plist = ^list;
list = record
data : sinhvien看此选手;
下一个 : 列表;
比;
我还是不明白’ 'Plist'光标样式’ 手‘Plist’ 指向“列表”’ 然后‘下一步’ 意味着
问题是,为什么该代码可以存储列表?
我想下一个喜欢 1 链接到与Plist类型相同的下一个元素的链.
插图图像可以在这里查看: