ポインタ代入

ポインタが関係する通常の代入では,ポインタはその指示先の別名となっています。ポインタ代入では,ポインタは指示先に結合されます。指示先が不定または空状態である場合,ポインタは指示先と同じ状態になります。ポインタ代入文は次の形式を持ちます。

pointer-object => target

pointer-object
POINTER 属性で宣言された変数名または構造体成分。

target
変数または式。その型,種別パラメタ,および次元数は,pointer-object と同じでなくてはなりません。ベクトル添字を持つ部分配列であってはなりません。

規則と振る舞い

指示先が変数である場合,その変数が POINTER または TARGET 属性を持つか,親オブジェクトが TARGET 属性を持つ部分オブジェクトでなくてはなりません。

指示先が式である場合,その結果はポインタでなくてはなりません。

指示先がポインタでない場合 (TARGET 属性を持つ),ポインタ・オブジェクトが指示先に結合されます。

指示先がポインタである場合 (POINTER 属性を持つ),その状態がポインタ・オブジェクトの状態を次のように決定します。

ポインタの引用または定義は,そのポインタが引用可能なまたは確定可能な指示先に結合されていない限り行えません。

ポインタ代入が行われると,それ以前のポインタ・オブジェクトと指示先の間の結合はすべて終了させられます。

ポインタは,構造型組込み代入文またはユーザー定義代入文の実行によっても,ポインタ構造体成分に代入することができます。

また,ポインタの結合は,ALLOCATE 文を使ってポインタを割り付けることで行うこともできます。

ポインタは,割付け解除,ポインタの空化 (DEALLOCATE または NULLIFY 文を使用),または NULL 組込み関数の引用によって空状態になります。

以下にポインタ代入の例を示します。

	HOUR => MINUTES(1:60)		! 指示先は配列
	M_YEAR => MY_CAR%YEAR		! 指示先は構造体成分
	NEW_ROW%RIGHT => CURRENT_ROW	! ポインタ・オブジェクトは構造体成分
	PTR => M			! 指示先は変数
	POINTER_C => NULL ()		! NULL 組込み関数の引用

次の例は,ポインタとしての指示先を示しています。

	INTEGER, POINTER :: P, N
	INTEGER, TARGET :: M
	INTEGER S
	M = 14
	N => M			! N に M を結合します
	P => N			! P に M から N を結合します
	S = P + 5

S に代入される値は 19 (14 + 5) です。

ポインタが指示先に結合されている場合や,2 つのポインタが同じ指示先に結合されている場合,組込み関数 ASSOCIATED を使って見つけ出すことができます。以下に例を示します。

	REAL C (:), D(:), E(5)
	POINTER C, D
	TARGET E
	LOGICAL STATUS
	! ポインタを代入します。
	C => E
	! ポインタを代入します。
	D => E
	! C が結合されていれば,TRUE を返します。
	STATUS = ASSOCIATED (C)
	! C が E に結合されていれば,TRUE を返します。
	STATUS = ASSOCIATED (C, E)
	! C と D が同じ指示先に結合されて
	! いれば,TRUE を返します。
	STATUS = ASSOCIATED (C, D)

関連情報