Fortran指針

2018-12-12 14:24 更新

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

一個指針是通過分配或指針賦值的目標(biāo)有關(guān)。

聲明指針變量

指針變量聲明的指針屬性。

下面的例子顯示指針變量的聲明:

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

指針可以指向:

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

分配空間的指針

分配語句允許你為指針對象分配空間。例如:

program pointerExample
implicit none

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

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

1
5

你應(yīng)該DEALLOCATE語句清空分配的存儲空間時,不再需要它,避免閑置,無法使用的內(nèi)存空間積累。

目標(biāo)和協(xié)會

一個目標(biāo)是另一個普通變量,以預(yù)留空間它。目標(biāo)變量必須與目標(biāo)屬性聲明。

您指針變量使用關(guān)聯(lián)運(yùn)營商的目標(biāo)變量關(guān)聯(lián)(=>)。

讓我們重寫前面的例子中,以證明概念:

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í)行時,它產(chǎn)生了以下結(jié)果:

1
1
5
5
8
8

一個指針可以是:

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

另外,在上述程序中,我們已關(guān)聯(lián)的指示器p1,與目標(biāo)T1,使用=>運(yùn)算符。相關(guān)的功能,測試指針的關(guān)聯(lián)狀態(tài)。

廢止聲明的關(guān)聯(lián)從一個目標(biāo)的指針。

抵消不清空目標(biāo),因?yàn)榭赡艽嬖谝粋€以上的指針指向同一目標(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í)行時,它產(chǎn)生了以下結(jié)果:

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

請注意,每次運(yùn)行代碼時,內(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í)行時,它產(chǎn)生了以下結(jié)果:

2  2  2  4

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號