位置:首頁 > 高級語言 > Fortran教學 > Fortran指針

Fortran指針

在大多數編程語言中,一個指針變量存儲對象的內存地址。然而,在Fortran中,指針是具有不是僅僅存儲存儲器地址多功能性的數據對象。它包含有關特定對象的詳細信息,如類型,等級,擴展和存儲器地址。

指針是通過分配或指針賦值的目標相關聯。

聲明一個指針變量

一個指針變量與指針屬性聲明。

下麵的實施例示出了聲明指針變量:

integer, pointer :: p1 ! pointer to integer  
real, pointer, dimension (:) :: pra ! pointer to 1-dim real array  
real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array

指針可以指向:

  • 動態分配的內存區域
  • 數據對象與目標屬性相同類型的指針

分配指針的空間

allocate語句可以分配指針對象空間。例如:

program pointerExample
implicit none

   integer, pointer :: p1
   allocate(p1)
   
   p1 = 1
   Print *, p1
   
   p1 = p1 + 4
   Print *, p1
   
end program pointerExample

當上述代碼被編譯和執行時,它產生了以下結果:

1
5

應該解除分配語句清空該分配的存儲空間當它不再需要,並避免未使用的和不可用的存儲器空間的積累。

目標和關聯

目標是另一個正態變量,空間預留給它。目標變量必須與目標屬性進行聲明。

一個指針變量使用的關聯操作符使目標變量相關聯(=>)。

讓我們重寫前麵的例子中,以說明這個概念:

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1 
   
   p1=>t1
   p1 = 1
   
   Print *, p1
   Print *, t1
   
   p1 = p1 + 4
   
   Print *, p1
   Print *, t1
   
   t1 = 8
   
   Print *, p1
   Print *, t1
   
end program pointerExample

當上述代碼被編譯和執行時,它產生了以下結果:

1
1
5
5
8
8

指針可以是:

  • 未定義的
  • 關聯的
  • 未關聯的

在上麵的程序中,我們使用associated的指針p1與目標t1時,使用=>運算符。相關的函數,測試指針的關聯狀態。

這個聲明無效的關聯從一個目標一個指針。

無效非空目標,因為可能有多個指針指向同一個目標。然而空指針指也是無效的。

示例 1

下麵的例子演示了概念:

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1 
   integer, target :: t2
   
   p1=>t1
   p1 = 1
   
   Print *, p1
   Print *, t1
   
   p1 = p1 + 4
   Print *, p1
   Print *, t1
   
   t1 = 8
   Print *, p1
   Print *, t1
   
   nullify(p1)
   Print *, t1
   
   p1=>t2
   Print *, associated(p1)
   Print*, associated(p1, t1)
   Print*, associated(p1, t2)
   
   !what is the value of p1 at present
   Print *, p1
   Print *, t2
   
   p1 = 10
   Print *, p1
   Print *, t2
   
end program pointerExample

當上述代碼被編譯和執行時,它產生了以下結果:

1
1
5
5
8
8
8
T
F
T
952754640
952754640
10
10

請注意,每次運行該代碼時,內存地址會有所不同。

示例 2

program pointerExample
implicit none

   integer, pointer :: a, b
   integer, target :: t
   integer :: n
   
   t= 1
   a=>t
   t = 2
   b => t
   n = a + b
   
   Print *, a, b, t, n 
   
end program pointerExample

當上述代碼被編譯和執行時,它產生了以下結果:

2  2  2  4