This post is Private. Only a writer or those who know its URL can access this post.

Improve article
RevisionsShow article in Markdown
Report article
Help us understand the problem. What is going on with this article?

<10> ポインタ型 (標準 Pascal 範囲内での Delphi 入門)〔裏〕

10. ポインタ型 (Pointer Types)

10.1. ポインタ変数と動的変数 (対象変数)

(10.1.1.) ポインタ型の宣言

Modula-2 では POINTER TO でポインタ変数を作るようになっています。^ は逆参照演算子として使うので、この記述の方が初学者は混乱しないかもしれません。

Modula-2
TYPE
  T: INTEGER;
  P = POINTER TO T;

10.2. New と Dispose

動的変数が不要になった場合には Dispose(Ptr) を使って動的変数が使用していた領域を解放します。

クラシック Pascal には Dispose() がありませんでした。

See also:

(10.2.1.) New と Dispose の二番目の書式

Delphi では可変部を持つレコード型は共用体の代わりくらいにしか使われていないため、「何故レコード型の可変部に case 文に類似した構文が含まれているのか?」というのを理解しづらいと思います。

New と Dispose の二番目の書式は解りにくい機能ですが、要は入れ子になった可変部のあるレコード型を一部に限定して確保するメモリを節約するというものです 1。New(P, C1,..., Cn) を使って作られた動的変数は Dispose(Q, K1,..., Km) で解放する必要があります。

次のような定義があったとします。

type
  a = (a1, a2);
  b = (b1, b2);
  c = (c1, c2);
  rec1 = record
           case tc: c of
             c1: (fc1: Integer);
             c2: ()
         end;
  rec2 = record
           case ta: a of
             a1: (case tb: b of
                    b1: (fb1: rec1);
                    b2: ()
                 );
             a2: ()
         end;
var
  p: ^rec2;                                                 

パラメータが一つの書式を使うと、rec2 は可変部のうちの最大の可変要素サイズでメモリが確保されますが、

  New(p);

二番目の書式を使うと、パラメータで指定した可変要素のサイズでメモリが確保されます。次の例では b1 を格納するためのメモリは確保されません。

  New(p, a1, b2);

二番目以降の実パラメータは可変部の可変要素に使った選択定数を渡します。変数を渡すことはできません。

レコード型の
ポインタ変数
1 段目の
可変要素
2 段目の
可変要素
p a1 b2

次の指定は許されません。b1 は入れ子になった可変部を持っていないからです。

  New(p, a1, b1, c2);

二番目の書式を使って作られた動的変数 p は、rec2 型の変数 r への代入もアクセスもできない事に注意が必要です。

var
  r: rec2;
  p: ^rec2;
begin
  New(p, a1, b2); 

  p^ := r; { NG }
  r := p^; { NG }

  Dispose(p, a1, b2); 
end.

この二番目の書式を詳細に解説してある書籍はそれほど多くありません。

(10.3.) @ 演算子

Delphi には @ 演算子があります。

この拡張は Apple Lisa Pascal 由来のようです。

See also:

(10.4.) ポインタ定数とグローバルポインタ変数の初期化

(10.5.) Pointer 型

(10.6.) 型チェック済みポインタ

(10.7.) 型キャスト

(10.7.1.) 値 型キャスト

(10.7.2.) 変数 型キャスト

(10.8.) ポインタ演算 (Pointer Arithmetic)

索引

:ramen: [ ← 9. ファイル型〔裏〕 ] [ ↑ 目次へ ] [ → 11. 手続きと関数〔裏〕 ]


  1. 木の枝をそのまま使うか、枝打ちして一部の枝だけを使うかといった感じです。 

ht_deko
とある熊本の障害復旧(トラブルシューター)
https://ht-deko.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away