在大多數(shù)編程語言中,一個(gè)指針變量存儲對象的內(nèi)存地址。然而,在Fortran中,指針是具有不是僅僅存儲存儲器地址多功能性的數(shù)據(jù)對象。它包含有關(guān)特定對象的詳細(xì)信息,如類型,等級,擴(kuò)展和存儲器地址。
指針是通過分配或指針賦值的目標(biāo)相關(guān)聯(lián)。
一個(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
指針可以指向:
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)是另一個(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
指針可以是:
在上面的程序中,我們使用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