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



<前へ   目次へ   次へ>

Copyright ©2008 JAMSTEC All Rights Reserved.