[パスカル – 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.
データを入力します:
結果:
記事または参照-高
ありがとう. 頻繁にオフラインでのブログをご覧ください. ^^
ウェイター, 私は少しのために尋ねました, 二つの変数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」カーソルスタイル’ 手「Plist’ 「リスト」を指します’ 次に「次へ」’ 意味する
問題は、そのコードがリストを格納できる理由です
次のようなものを想像します 1 Plistと同じタイプの次の要素にフックするチェーン.
イラスト画像はこちらからご覧いただけます: