文と属性:オブジェクトがポインタ (動的変数) であることを指定します。ポインタはデータを含んでいるのではなく,データが格納されているスカラまたは配列変数を指します。ポインタに対しては初期記憶域は設定されません。ポインタのためのメモリー記憶域はプログラムの実行中に作成されます。
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 属性を与えられている場合,形状無指定配列として宣言しなくてはなりません。
ポインタは DATA,EQUIVALENCE,または NAMELIST 文で指定することはできません。
Fortran 90 ポインタは,整数型ポインタと同じではありません。詳細は,「POINTER - Compaq Fortran」を参照してください。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
ALLOCATE,ASSOCIATED,DEALLOCATE,NULL,NULLIFY,POINTER - Compaq Fortran,TARGET,型宣言,形状無指定指定,属性の互換性,ポインタ結合,ポインタ代入,ポインタ引数
例
次の例は,POINTER 属性を指定する型宣言文を示しています。
TYPE(SYSTEM), POINTER :: CURRENT, LAST REAL, DIMENSION(:,:), POINTER :: I, J, REVERSE
次に POINTER 文の例を示します。
TYPE(SYSTEM) :: TODAYS POINTER :: TODAYS, A(:,:)
\DF98\SAMPLES\TUTORIAL にある POINTER.F90 と POINTER2.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