[帕斯卡尔 – 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.

输入数据:
链表

结果:
链表