[パスカル – 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. カーソル変数を宣言
私たちは、直接または間接的に宣言することができます. 例えば、sinhvien入力し、我々はControSVを宣言することができます

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ポインタが特殊なポインタであります, どこを指していません。. ポインタ好まないの値で 0 または中空のポインタのすべてのタイプに対応.

4. オペレーション.
ザ·. 割り当て
2つのカーソルには、割付を持つ相互に割り当てることができます ( := ) 彼らは同じ型を持っている場合. 上記の例では、割り当てることができます:

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.

データを入力します:
リンクリスト

結果:
リンクリスト