POINTER - Fortran 90/95

文と属性:オブジェクトがポインタ (動的変数) であることを指定します。ポインタはデータを含んでいるのではなく,データが格納されているスカラまたは配列変数を指します。ポインタに対しては初期記憶域は設定されません。ポインタのためのメモリー記憶域はプログラムの実行中に作成されます。

POINTER 属性は型宣言文または POINTER 文で指定することができ,以下のいずれかの形式を取ります。

形式

型宣言文

type, [att-ls,] POINTER [,att-ls] :: ptr [(d-spec)] [,ptr [(d-spec)]]...

POINTER [::] ptr [(d-spec)] [,ptr [(d-spec)]]...

type
データ型指定子。

att-ls
省略可能な属性指定子並び。

ptr
ポインタの名前。ポインタは INTENT 属性や PARAMETER 属性と共に宣言することはできません。

d-spec
(省略可能) 形状無指定 (: [,:]...)。各コロンは配列の中の 1 つの次元を表しています。

規則と振る舞い

ポインタに対しては,ALLOCATE 文によって割り付けが行われるか,割付け済みの指示先に結合されるまでは,記憶域空間は割り付けられません。ポインタにメモリーが結合されるまで,ポインタの引用や定義を行うことはできません。

個々のポインタは,その時点で指示先オブジェクトに結合されているかどうかを示す結合状態を持っています。最初に宣言された時点では,ポインタの状態は不定です。ASSOCIATED 組込み関数を使うと,ポインタの結合状態を知ることができます。

ポインタが配列であり,プログラムの他の場所で DIMENSION 属性を与えられている場合,形状無指定配列として宣言しなくてはなりません。

ポインタは DATAEQUIVALENCE,または NAMELIST 文で指定することはできません。

Fortran 90 ポインタは,整数型ポインタと同じではありません。詳細は,「POINTER - Compaq Fortran」を参照してください。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

ALLOCATEASSOCIATEDDEALLOCATENULLNULLIFYPOINTER - Compaq FortranTARGET型宣言形状無指定指定属性の互換性ポインタ結合ポインタ代入ポインタ引数

次の例は,POINTER 属性を指定する型宣言文を示しています。

	TYPE(SYSTEM), POINTER :: CURRENT, LAST
	REAL, DIMENSION(:,:), POINTER :: I, J, REVERSE

次に POINTER 文の例を示します。

	TYPE(SYSTEM) :: TODAYS
	POINTER :: TODAYS, A(:,:)

\DF98\SAMPLES\TUTORIAL にある POINTER.F90POINTER2.F90 も参照してください。

以下に別の例を示します。

	REAL, POINTER :: arrow (:)
	REAL, ALLOCATABLE, TARGET :: bullseye (:,:)

	! 以下の文は,メモリーの未使用ブロックに
	! ポインタに結合しています。

	ALLOCATE (arrow (1:8), STAT = ierr)
	IF (ierr.eq.0) WRITE (*,'(/1x,a)') 'ARROW allocated'
	arrow = 5.
	WRITE (*,'(1x,8f8.0/)') arrow
	ALLOCATE (bullseye (1:8,3), STAT = ierr)
	IF (ierr.eq.0) WRITE (*,*) 'BULLSEYE allocated'
	bullseye = 1.
	bullseye (1:8:2,2) = 10.
	WRITE (*,'(1x,8f8.0)') bullseye

	! 以下の結合は,名前がなく,他のポインタと結合されて
	! いない第 1 指示先との結合を壊し,失われます。
	! ARROW は新しい形式を得ます。

	arrow => bullseye (2:7,2)
	WRITE (*,'(/1x,a)') 'ARROW is repointed & resized, all the 5s are lost'
	WRITE (*,'(1x,8f8.0)') arrow

	NULLIFY (arrow)
	IF (.NOT.ASSOCIATED(arrow)) WRITE (*,'(/a/)') ' ARROW is not pointed'

	DEALLOCATE (bullseye, STAT = ierr)
	IF (ierr.eq.0) WRITE (*,*) 'Deallocation successful.'
	END