鍍金池/ 教程/ Java/ Fortran指針
Fortran還原功能
Fortran關(guān)系運(yùn)算符
Fortran運(yùn)算符優(yōu)先級
Fortran基本語法
Fortran文件輸入輸出
Fortran嵌套select case結(jié)構(gòu)
Fortran變量
Fortran Cycle語句
Fortran語言環(huán)境設(shè)置
Fortran數(shù)據(jù)類型
Fortran數(shù)組
Fortran字符
Fortran if...else if...else 語句
Fortran調(diào)試程序
Fortran編程風(fēng)格
Fortran if...then語句結(jié)構(gòu)
Fortran嵌套循環(huán)
Fortran常量
Fortran循環(huán)
Fortran導(dǎo)出數(shù)據(jù)類型
Fortran字符串
Fortran操作函數(shù)
Fortran do...while循環(huán)結(jié)構(gòu)
Fortran內(nèi)部函數(shù)
Fortran數(shù)字精度
Fortran選擇決策
Fortran重塑函數(shù)
Fortran運(yùn)算符
Fortran構(gòu)造函數(shù)
Fortran模塊
Fortran位置函數(shù)
Fortran數(shù)字
Fortran指針
Fortran算術(shù)運(yùn)算符
Fortran exit語句
Fortran動(dòng)態(tài)數(shù)組
Fortran嵌套if結(jié)構(gòu)
Fortran select case結(jié)構(gòu)
Fortran向量和矩陣乘法函數(shù)
Fortran邏輯運(yùn)算符
Fortran if...then...else 結(jié)構(gòu)
Fortran教程
Fortran過程
Fortran Stop語句
Fortran基本輸入輸出
Fortran do循環(huán)結(jié)構(gòu)
Fortran查詢函數(shù)

Fortran指針

在大多數(shù)編程語言中,一個(gè)指針變量存儲對象的內(nèi)存地址。然而,在Fortran中,指針是具有不是僅僅存儲存儲器地址多功能性的數(shù)據(jù)對象。它包含有關(guān)特定對象的詳細(xì)信息,如類型,等級,擴(kuò)展和存儲器地址。

指針是通過分配或指針賦值的目標(biāo)相關(guān)聯(lián)。

聲明一個(gè)指針變量

一個(gè)指針變量與指針屬性聲明。

下面的實(shí)施例示出了聲明指針變量:

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

指針可以指向:

  • 動(dòng)態(tài)分配的內(nèi)存區(qū)域
  • 數(shù)據(jù)對象與目標(biāo)屬性相同類型的指針

分配指針的空間

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

program pointerExample
implicit none

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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

1
5

應(yīng)該解除分配語句清空該分配的存儲空間當(dāng)它不再需要,并避免未使用的和不可用的存儲器空間的積累。

目標(biāo)和關(guān)聯(lián)

目標(biāo)是另一個(gè)正態(tài)變量,空間預(yù)留給它。目標(biāo)變量必須與目標(biāo)屬性進(jìn)行聲明。

一個(gè)指針變量使用的關(guān)聯(lián)操作符使目標(biāo)變量相關(guān)聯(lián)(=>)。

讓我們重寫前面的例子中,以說明這個(gè)概念:

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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

1
1
5
5
8
8

指針可以是:

  • 未定義的
  • 關(guān)聯(lián)的
  • 未關(guān)聯(lián)的

在上面的程序中,我們使用associated的指針p1與目標(biāo)t1時(shí),使用=>運(yùn)算符。相關(guān)的函數(shù),測試指針的關(guān)聯(lián)狀態(tài)。

這個(gè)聲明無效的關(guān)聯(lián)從一個(gè)目標(biāo)一個(gè)指針。

無效非空目標(biāo),因?yàn)榭赡苡卸鄠€(gè)指針指向同一個(gè)目標(biāo)。然而空指針指也是無效的。

示例 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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

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

請注意,每次運(yùn)行該代碼時(shí),內(nèi)存地址會有所不同。

示例 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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

2  2  2  4