ポインター データ

ポインター値は、変数の記憶域のアドレスです。次に例を示します。

DECLARE K FIXED BINARY(15); 
DECLARE A(5) FIXED BINARY(15); 
DECLARE P POINTER;
   .
   .
   .
P = ADDR(A(K));

この例では、P はあらゆる変数 (非整列ビット文字列は例外となる場合がある) のアドレスを保持できるポインター変数です (詳細については、『Open PL/I ユーザー ガイド』を参照)。この代入文では、ADDR 組み込み関数を使用して A (K) のアドレスが計算され、そのアドレスが P の値として代入されます。

ポインターは、ポイントする対象となる記憶域にアクセスするためのテンプレートと併用されます。次に例を示します。

DECLARE X FIXED BINARY(15) BASED;
   .
   .
   .
P->X = 10;

この例では、X は固定小数点 2 進整数を表す基底付き変数 (つまり、テンプレート) です。P は、本セクションの最初の例に示したポインター変数です。この代入文では、10 が A (K) に代入されます。

ポインターは、動的に割り当てられた基底付き変数の記憶域を見つけるためによく使用されます (「記憶域クラス」の章の「Based Variables」を参照) が、上記の 2 つの例に示したように、別の変数の記憶域にアクセスするためのメカニズムを提供する場合もあります。

Null ポインター値は NULL 組み込み関数によって生成されます。変数のアドレスを指定しない一意の値で、次の例に示すように、ポインター変数が現在アドレス指定を実行していないことを示すために使用されます。

DECLARE CHAIN_HEAD POINTER;
   .
   .
   .
CHAIN_HEAD = NULL();

NULL の内部表現は -setnull コンパイラ オプションによって決まります。コンパイラ オプションの詳細については、『Open PL/I ユーザー ガイド』を参照してください。

ポインター値によって記憶域のアドレスが指定されている変数が解放されると、そのポインター値は使用されなくなります。このようなポインターを使用して記憶域にアクセスすると、予期しない結果になります。

ADDR 組み込み関数を使用して非整列ビット データのアドレスを計算することはできません。したがって、このような制限が適用される場合は、ポインター値によって非整列ビット文字列データのアドレスが指定されることはありません。ただし、その他のデータはすべて、コンピューターのアドレス指定機能に関係なく、ポインターによって常にアドレス指定できます。

注:

一般にテンプレートとして使用される基底付き変数では、ポインターによってアドレス指定される変数と同じデータ型を使用する必要があります。この規則に違反すると、予期しない結果になります。この規則に違反しているプログラムは、「正しい」結果が得られていても、最適化が有効になっている状態でコンパイルされた場合、または PL/I の別の実装に移動した場合にエラーとなる可能性があります。

ポインター値は、定数で表すことはできません。ただし、定数が求められる可能性のあるコンテキスト (INITIAL 属性など) で NULL 組み込み関数を使用することはできます。