
- Fortran 教程
- Fortran - 首頁
- Fortran - 概述
- Fortran - 環境設定
- Fortran - 基本語法
- Fortran - 資料型別
- Fortran - 變數
- Fortran - 常量
- Fortran - 運算子
- Fortran - 決策
- Fortran - 迴圈
- Fortran - 數字
- Fortran - 字元
- Fortran - 字串
- Fortran - 陣列
- Fortran - 動態陣列
- Fortran - 派生資料型別
- Fortran - 指標
- Fortran - 基本輸入輸出
- Fortran - 檔案輸入輸出
- Fortran - 過程
- Fortran - 模組
- Fortran - 內在函式
- Fortran - 數值精度
- Fortran - 程式庫
- Fortran - 程式設計風格
- Fortran - 程式除錯
- Fortran 資源
- Fortran - 快速指南
- 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
指標可以指向:
動態分配的記憶體區域。
與指標型別相同的資料物件,具有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
廣告