Fortran中的指標使用

2021-06-16 23:53:04 字數 4312 閱讀 8962

fortran中的指標如何使用,功能怎樣,下面的的5個例子足可以讓你明白一切!

對於單個值,用起來很簡單,但是無法體現指標的強大功能,

示例1:

program test_pointer_1

implicit none

integer,pointer::p1,p2 !定義指標

integer::s

!------------------------------------

allocate(p1,p2) !分配記憶體空間

read(*,*)p1,p2

s=p1+p2

write(*,*)'s=',s

deallocate(p1,p2) !釋放記憶體空間

!------------------------------------

end program test_pointer_1

用指標來運算元組,可以隨意引用陣列中的任意片段,是指標的強大功能之一,

請看下面的示例2:

program test_pointer_2

implicit none

integer,pointer::a(:)

integer,target::b(5)=(/1,2,3,4,5/)

!-----------------------------------------

!---引用整個陣列

a=>b ! a(1)=1;a(2)=2;a(3)=3;a(4)=4;a(5)=5

write(*,*) 'a=>b ',a

!-----------------------------------------

!---引用陣列連續的片段

a=>b(2:3) ! a(1)=2;a(2)=3

write(*,*) 'a=>b(2:3) ',a

!-----------------------------------------

!---引用陣列不連續的片段

a=>b(1:5:2) ! a(1)=1;a(2)=3;a(3)=5

write(*,*) 'a=>b(1:5:2) ',a

!-----------------------------------------

!---引用陣列的倒序(相當於將陣列左右顛倒)

a=>b(5:1:-1) ! a(1)=5;a(2)=4;a(3)=3;a(4)=2;a(5)=1

write(*,*) 'a=>b(5:1:-1) ',a

!------------------------------------

end program test_pointer_2

如果是二維陣列,想引用某行或者某列的資料,

請看示例3:

program test_pointer_3

implicit none

integer::i,j,k

real,pointer::a(:)

real,target::b(3,4)

!-----------------------------------------

!---二維陣列賦初值

!data b/1,2,3,4,5,6,7,8,9,10,11,12/

data ((b(i,j),i=1,3),j=1,4)/1,2,3,4,5,6,7,8,9,10,11,12/

!-----------------------------------------

!---列印二維陣列內容

do i=1,3

write(*,*) b(i,:)

end do

!-----------------------------------------

!---引用二維陣列第二行

a=>b(2,:)

write(*,*) 'a=>b(2,:) ',a

!-----------------------------------------

!---引用二維陣列第三列

a=>b(:,3)

write(*,*) 'a=>b(:,3) ',a

!------------------------------------

end program test_pointer_3

程式執行結果如下:

上面的指標是一維的,對於用二維指標來引用二維陣列中的二維片段也是同樣方便,

請看示例4:

program test_pointer_4

implicit none

integer::i,j,k

real,pointer::p(:,:) !二維的指標

real,target::b(3,4)

!-----------------------------------------

!---二維陣列賦初值

!data b/1,2,3,4,5,6,7,8,9,10,11,12/

data ((b(i,j),i=1,3),j=1,4)/1,2,3,4,5,6,7,8,9,10,11,12/

!-----------------------------------------

!---列印二維陣列內容

write(*,*) 'b(3,4)'

do i=1,3

write(*,*) b(i,:)

end do

!-----------------------------------------

!---引用二維陣列中的二維片段

p=>b(1:2,2:3)

write(*,*) 'p=>b(1:2,2:3)'

do i=1,2

write(*,*) p(i,:)

end do

!-----------------------------------------

p=0 !將b(1:2,2:3)中的元素置為0

!---列印二維陣列內容

write(*,*) 'b(3,4)'

do i=1,3

write(*,*) b(i,:)

end do

!------------------------------------

end program test_pointer_4

執行如下:

把指標當做動態陣列來使用,也是很方便的:

program test_pointer_5

implicit none

integer::i

real,pointer::p(:) !利用指標為陣列動態分配記憶體

!-----------------------------------------

allocate(p(5)) !---為陣列(指標)分配記憶體空間

!-----------------------------------------

!---陣列賦值

do i=1,5

p(i)=i*2

end do

!-----------------------------------------

write(*,*) 'p(5)=',p !p(5)=2,4,6,8,10

!-----------------------------------------

deallocate(p) !---為陣列(指標)釋放記憶體空間

end program test_pointer_5

上面的指標使用是最初級的,高階的用法還有實現指標鍊錶和type型別的指標陣列等

對於指標下面的語句**常常用到:

! 常用語句

! pointer_c=>null(); ! 指標指向null

! nullify(ptr_a); ! 指標指向null

! status = associated (c); ! 如果c有所指向返回true

! status = associated (c, e); ! 如果c指向e返回true,如果c和e指向的目標相同或者二者均為null返回true(二者都是指標)

高效使用FORTRAN陣列

發信人 huicai 老灰菜 信區 fortran 標 題 高效使用fortran陣列 發信站 瀚海星雲 2002年10月10日23 06 02 星期四 站內信件 高效使用fortran陣列 1 陣列整體訪問 最快的陣列操作發生在連續訪問整個陣列或大部分陣列的時候。對整個陣列或大部分陣列實施乙個或者...

Fortran中的輸入輸出!!!

我們學習計算機語言的目的在於與計算機進行互動 輸入即向計算機傳送指令,輸出即計算機對我們傳送的指令做出的響應 所以互動的前提首先要搞清程式語言的輸入輸出 輸入輸出方法有 write print read 我們需要在輸入輸出語句中提供三方面的資訊 1 通過什麼裝置進行輸入輸出 2 採用的輸入輸出格式 ...

C 中函式指標的使用

在c c 中存在著函式指標,即指向函式的指標。我目前已知的兩種使用方法是 include include typedef int pinnt define pp int int funca int a,int b int funcb int a,int b int main int argc,cha...