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