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

指標可以指向:

  • 動態分配的記憶體區域。

  • 與指標型別相同的資料物件,具有target屬性。

為指標分配空間

allocate語句允許您為指標物件分配空間。例如:

program pointerExample
implicit none

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

編譯並執行上述程式碼後,將產生以下結果:

1
5

當不再需要分配的儲存空間時,應使用deallocate語句清空它,避免積累未使用的和不可用的記憶體空間。

目標和關聯

目標是另一個普通變數,已為其預留了空間。目標變數必須用target屬性宣告。

您可以使用關聯運算子(=>)將指標變數與目標變數關聯。

讓我們重寫前面的示例,以演示這個概念:

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

指標可以是:

  • 未定義的
  • 已關聯的
  • 已解除關聯的

在上例程式中,我們使用=>運算子將指標p1與目標t1關聯。associated函式測試指標的關聯狀態。

nullify語句將指標與目標解除關聯。

nullify不會清空目標,因為可能有多個指標指向同一個目標。但是,清空指標也意味著取消關聯。

示例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
0
0
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
廣告