6章:構造型とポインタ
6.2 ポインタ
ここでは、ポインタについて説明する。ポインタを使用すると、動的データ構造を構築することができる。
6.2.1 ポインタ変数
ここでは、ポインタ変数について説明する。ポインタ変数はその名の通り変数の記憶領域を「指す」変数である。
以下は連結リストと呼ばれる動的データ構造の一例で、データ成分とリンク成分を併せ持った構造体(ノード)によって構成されている。
図中のSTART_PTR、NEXT_PTRがポインタ変数で、それぞれ'APPLE'、'ORANGE'を含むノードの記憶位置を指示している。

ポインタ変数の定義
ポインタ変数は以下のように定義する。
型, POINTER :: ポインタ変数名
■型
定義したポインタ変数がアクセスするデータ型を指定する。文字列型、実数型、整数型なのどのほか、構造型も指定できる
■ポインタ変数名
変数名の付け方は通常の変数名と同じである。
(例)
整数型の記憶位置に対するポインタP1の定義
INTEGER, POINTER :: P1
6.2.2 演算
ポインタの代入
ポインタ変数は以下のように代入する。
ポインタ変数名 => ターゲット変数名(またはポインタ変数名)
ターゲット変数名を指定する場合、対象の変数にはTARGET属性を指定する必要がある。
また、上記を通常の変数としての代入文、すなわち、
ポインタ変数名1 = ポインタ変数名2
のように記述した場合には、ポインタ変数1が指し示す変数にポインタ変数名2が指し示す変数の値を代入する、という全く異なった操作になるので注意が必要である。
6.2.3 ポインタ変数の操作
以下ではポインタ変数そのものを操作する文、すなわちALLOCATE文、DEALLOCATE文、NULLIFY文およびASSOCIATED文について説明する。
■ALLOCATE文
定義した直後のポインタには指示先がない。この状態を不定と呼ぶ。ALLOCATE文を使用すると、ポインタの記憶位置を確保することができる。
ALLOCATE文は以下のように書く。
ALLOCATE(ポインタ名)
(例)ポインタP1が指示する新たな記憶位置を確保する
ALLOCATE(P1)
■DEALLOCATE文
実行中に利用できるメモリには限りがある。DEALLOCATE文を使用すると、不要になった記憶位置を解放することができる。 DEALLOCATE文は以下のように書く。
DEALLOCATE(ポインタ名)
(例)ポインタP1が指示する記憶位置を解放する
DEALLOCATE(P1)
■NULLIFY文
ポインタの結合を解除し、新たな指示先を指定していない状態を空状態と呼ぶ。NULLIFY文を使用すると、ポインタ変数を空状態にすることができる。
NULLIFY文は以下のように書く。
NULLIFY(ポインタ名)
(例)ポインタP1を空状態にする
NULLIFY(P1)
■ASSOCIATED文
以上のように、ポインタ変数の状態には不定、指示状態、空状態の3つがある。
ASSOCIATED文を使用すると、指定したポインタの結合状態を確認することができる。
ASSOCIATED文は以下のように書く。
ASSOCIATED(ポインタ名)
(例)
ポインタP1の結合状態を確認する
ASSOCIATED(P1)
結合されていれば.TRUE.、そうでなければ.FALSE.が得られる。
6.2.4 ポインタ配列
ポインタを要素とする配列をポインタ配列と呼ぶ。定義時に必要なのは次元指定のみで寸法指定は不要であるため、実行時まで寸法が不明な配列を扱いたいときに便利である。
ポインタ配列の定義
ポインタ配列は以下のように定義する。
型, POINTER :: ポインタ配列名(次元指定)
■型
定義したポインタ配列がアクセスする配列要素のデータ型を指定する。
■ポインタ配列名
変数名の付け方は通常の変数名と同じである。
■次元指定
コンパイル時配列および割付配列が指定可能である。
(例)行列FULLより、引数で指定された部分配列を出力するサブルーチン
SUBROUTINE PATARRAY(LINEMAX, LINEMIN, COLMAX, COLMIN)
INTEGER, INTENT(IN) :: LINEMIN, LINEMAX, COLMIN, COLMAX
INTEGER, POINTER :: PAT(:,:)
INTEGER :: I
PAT => FULL(LINEMIN:LINEMAX, COLMIN:COLMAX)
DO I = 1, LINEMAX - LINEMIN + 1
WRITE(*,*) PAT(I, *)
END DO
END SUBROUTINE PATARRAY