石家庄做网站的公司有哪些,做暖dnf动态ufo网站,免费网站推广怎么做,制作一个网站首页07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针#xff08;Poionter#xff09;的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言#xff0c;特别适合科学计算和数值分析。Fortran 9… 07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针Poionter的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言特别适合科学计算和数值分析。Fortran 90引入了指针的概念允许程序员动态地管理内存并在程序中创建灵活的数据结构前面已经简单介绍过指针类型的定义和赋值这一部分详细讲下指针的几种用法。
1 指针Poionter的有关内容 在Fortran中指针是一种特殊的变量类型用于存储内存地址。指针可以指向任何类型的数据包括标量、数组、派生类、函数和其他变量。以下是一些Fortran中使用指针的基本概念和用法
1.1 一般类型指针 下面运行示例中包含了简单类型指针使用的差不多所有情况可以仔细阅读注释进行理解。 implicit none! - 1 简单指针定义real(8),target :: realNum1 5.d0, realNum2 100.d0real(8),pointer :: ptr real(8),pointer :: ptr2 ! - 1. 简单的单一变量指针(有以下几种使用情况)! a 简单指针赋值print *,a:简单指针ptr获取了realNum1的地址此时打印ptr和realNum1是相同值ptr realNum1print *,ptr,ptr,realNum1,realNum1! b 在a的基础上修改print *,print *,b:修改realNum1的值ptr也发生改变,因为ptr realNum1,使ptr和realNum1指向同一处内存空间realNum1 55.d0print *,ptr,ptr,realNum1,realNum1! c 在b基础上print *,print *,c:修改ptr的值realNum1也发生变量,原因是ptr和realNum1地址一样ptr 60.d0print *,ptr,ptr,realNum1,realNum1! d 在c的基础上print *,print *,d:修改ptr指向realNum2,发现此时ptr的值和realNum2相同而realNum1保持c的结果ptr realNum2print *,ptr,ptr,realNum2,realNum2,realNum1,realNum1! e:如果d之后把指针ptr置空 [若要运行将e和f屏蔽]nullify(ptr)print *,print *,e:使ptr指向为空,发现打印ptr会报错; 仅仅ptr的指向噶了并不影响它指向的空间if(associated(ptr) .true.)thenprint *,ptr,ptr,realNum2,realNum2,realNum1,realNum1elseprint *,ptr,Null ,realNum2,realNum2,realNum1,realNum1endif!! f:如果d之后把指针ptr释放了(deallocate)!print *,!print *,f:执行这一步之前将e先屏蔽,使用deallocate释放调指针ptr,从输出结果可以看出仅仅ptr的指向噶了并不影响它指向的空间!deallocate(ptr)!if(associated(ptr) .true.)then! print *,ptr,ptr,realNum2,realNum2,realNum1,realNum1!else! print *,ptr,Null ,realNum2,realNum2,realNum1,realNum1!endif! g:给指针分配内存print *,print *,g:既然可以使用deallocate释放指针那当然也可以用allocate分配指针内存了allocate(ptr2)ptr2 200.d0 ! 给指针ptr2赋值print *,ptr2,ptr2! h:在g的基础上print *,print *,h:ptr2是指针被allocate分配过那是否还有指向的属性? 指向还是存在的但这时侯会存在一个问题 ptr2和realNum1都开辟过空间而ptr2又指向了realNum1的空间,那就有泄露产生了因为分配的指针是不会自己释放内存的;ptr2 realNum1print *,ptr2,ptr2,realNum1,realNum1! i: 在h的基础上print *,print *,i:指针ptr和指针ptr2之间的关系是怎样的让ptrptr2打印结果,发现ptr和ptr2此时指向的为同一空间值都为realNum1;ptrptr2 print *,ptr,ptr,ptr2,ptr2,realNum1,realNum1end program运行结果 1.2 数组指针 同样用示例说明用法主要介绍了数组指针基础用法、用指针进行数组截断、分析对内存的影响。 implicit none! - 2 指针数组定义integer,allocatable :: ind(:)real(8),target :: arr1(3),arr2(5)real(8),pointer :: p1(:) ! 指针数组 real(8),pointer :: p2(:) ! 指针数组 ! 先给arr1和arr2赋值call RANDOM_SEED()call RANDOM_NUMBER(arr1)arr2 5.d0! a:数组指针简单使用print *,print *,a:指针ptr数组简单使用二者地址一致打印结果相同同简单类型指针类似p1和arr1任何一个被该另一个也随着被改;p1 arr1print *,arr1,arr1,p1,p1! b:数组指针的特别用法print *,print *,b:数组指针可以指向数组中特定索引的元素(a:b),实现拆分数组指针可以多次指向同一目标, 指向的空间/内存必须是连续的;p1 arr1(2:3)print *,arr1,arr1,p1,p1! c:分配内存print *,print *,c:可以使用allocate进行内存分配,分配和指向不冲突allocate(p1(6))p1 6print *,arr1,arr1,p1,p1! d:数组指针释放print *,print *,c:可以使用allocate进行内存分配,分配和指向不冲突deallocate(p1)if( associated(p1) .true. )thenprint *,p1未成功释放elseprint *,p1已释放endifend program运行结果 1.3 派生类(type)指针 同样用示例说明用法主要介绍了派生类指针的基础用法和赋值。 program testimplicit none! - 3 派生类指针定义type :: test_type ! 定义派生类real(8) :: arr(100000)real(8) :: arr2(200000)real(8),pointer :: ptr3 end typetype(test_type),target :: typeValuetype(test_type),pointer :: ptype ! 定义派生类指针! -3. 派生类中指针使用较为常见因为派生类中可能会同时存在多个大数组对内存是致命伤害! - a:派生指针的赋值ptype typeValue ! 先给指针指向目标此时二者表示同一内存区域call RANDOM_NUMBER(ptype%arr) ! 给派生数组赋值ptype%ptr3 realNum1 ! 给指针的指针赋值print *print *,派生类指针初始化write(*,(a,f10.6,a,f10.6)),派生类指针下数组,ptype%arr(1), 派生类指针的指针,ptype%ptr3! - b:指针ptype内存释放print *deallocate(ptype)print *,释放指针ptype不影响派生变量typeValue前面的赋值write(*,(a,f10.6,a,f10.6)),派生类指针下数组,typeValue%arr(1), 派生类指针的指针,typeValue%ptr3! -c:派生类指针内存分配 print *allocate(ptype)call RANDOM_NUMBER(ptype%arr) ! 指针赋值ptype%ptr3 realNum1print *,指针ptype分配内存赋初值write(*,(a,f10.6,a,f10.6)),派生类指针下数组,ptype%arr(1), 派生类指针的指针,ptype%ptr3print *,对于这样的派生类使用指针是最高效、最省内存的了end program运行结果 1.4 函数指针 同样用示例说明用法主要介绍了调用函数指针计算、将函数指针作为参数在函数之间传递。
program testimplicit none! - 4 函数指针 procedure(f), pointer :: pfreal(8) :: fv,x! -4. 函数指针的使用! a: 函数指针的简单使用print *print *, 函数指针的简单使用pf fprint *, pf(2) , pf(2.d0) ! 调用f(2.)pf gprint *, pf(2) , pf(2.d0) ! 调用g(2.)print *! b: 函数指针可以作为变量进行传值pf fx 100.d0call calfun(pf,x,fv)write( *,*),函数指针作为参数的运算结果,fvcontainsreal function f(x)real(8), intent(in) :: xf x**2end function freal function g(x)real(8), intent(in) :: xg x**3end function gsubroutine calfun(fun,x,fv)procedure(f),pointer :: funreal(8),intent(in) :: xreal(8),intent(out) :: fvfv fun(x)end subroutineend program 2 可运行code
program test_pointerimplicit none! - 1 简单指针定义real(8),target :: realNum1 5.d0, realNum2 100.d0real(8),pointer :: ptr real(8),pointer :: ptr2 ! - 2 指针数组定义integer,allocatable :: ind(:)real(8),target :: arr1(3),arr2(5)real(8),pointer :: p1(:) ! 指针数组 real(8),pointer :: p2(:) ! 指针数组 ! - 3 派生类指针定义type :: test_type ! 定义派生类real(8) :: arr(100000)real(8) :: arr2(200000)real(8),pointer :: ptr3 end typetype(test_type),target :: typeValuetype(test_type),pointer :: ptype ! 定义派生类指针! - 4 函数指针 procedure(f), pointer :: pfreal(8) :: fv,xptr2 null() ! 指针指向空! - 1. 简单的单一变量指针(有以下几种使用情况)! a 简单指针赋值print *,a:简单指针ptr获取了realNum1的地址此时打印ptr和realNum1是相同值ptr realNum1print *,ptr,ptr,realNum1,realNum1! b 在a的基础上修改print *,print *,b:修改realNum1的值ptr也发生改变,因为ptr realNum1,使ptr和realNum1指向同一处内存空间realNum1 55.d0print *,ptr,ptr,realNum1,realNum1! c 在b基础上print *,print *,c:修改ptr的值realNum1也发生变量,原因是ptr和realNum1地址一样ptr 60.d0print *,ptr,ptr,realNum1,realNum1! d 在c的基础上print *,print *,d:修改ptr指向realNum2,发现此时ptr的值和realNum2相同而realNum1保持c的结果ptr realNum2print *,ptr,ptr,realNum2,realNum2,realNum1,realNum1!! e:如果d之后把指针ptr置空!nullify(ptr)!print *,!print *,e:使ptr指向为空,发现打印ptr会报错仅仅ptr的指向噶了并不影响它指向的空间!if(associated(ptr) .true.)then! print *,ptr,ptr,realNum2,realNum2,realNum1,realNum1!else! print *,ptr,Null ,realNum2,realNum2,realNum1,realNum1!endif!!! f:如果d之后把指针ptr释放了(deallocate)!print *,!print *,f:执行这一步之前将e先屏蔽,使用deallocate释放调指针ptr,从输出结果可以看出仅仅ptr的指向噶了并不影响它指向的空间!deallocate(ptr)!if(associated(ptr) .true.)then! print *,ptr,ptr,realNum2,realNum2,realNum1,realNum1!else! print *,ptr,Null ,realNum2,realNum2,realNum1,realNum1!endif! g:给指针分配内存print *,print *,g:既然可以使用deallocate释放指针那当然也可以分配指针allocate(ptr2)ptr2 200.d0 ! 给指针ptr2赋值print *,ptr2,ptr2! h:在g的基础上print *,print *,h:ptr2是指针被allocate分配过那是否还有指向的属性? 指向还是存在的但这时侯会存在一个问题ptr2和realNum1都开辟过空间而ptr2又指向了realNum1的空间,那就有泄露产生了因为分配的指针是不会自己释放内存的;ptr2 realNum1print *,ptr2,ptr2,realNum1,realNum1! i: 在h的基础上print *,print *,i:指针ptr和指针ptr2之间的关系是怎样的让ptrptr2打印结果,发现ptr和ptr2此时指向的为同一空间值都为realNum1;ptrptr2 print *,ptr,ptr,ptr2,ptr2,realNum1,realNum1! -2. 指针数组的使用! 先给arr1和arr2赋值call RANDOM_SEED()call RANDOM_NUMBER(arr1)arr2 5.d0! a:数组指针简单使用print *,print *,a:指针ptr数组简单使用二者地址一致打印结果相同同简单类型指针类似p1和arr1任何一个被该另一个也随着被改;p1 arr1print *,arr1,arr1,p1,p1! b:数组指针的特别用法print *,print *,b:数组指针可以指向数组中特定索引的元素(a:b),实现拆分数组指针可以多次指向同一目标, 指向的空间/内存必须是连续的;p1 arr1(2:3)print *,arr1,arr1,p1,p1! c:分配内存print *,print *,c:可以使用allocate进行内存分配,分配和指向不冲突allocate(p1(6))p1 6print *,arr1,arr1,p1,p1! d:数组指针释放print *,print *,c:可以使用allocate进行内存分配,分配和指向不冲突deallocate(p1)if( associated(p1) .true. )thenprint *,p1未成功释放elseprint *,p1已释放endif! -3. 派生类中指针使用较为常见因为派生类中可能会同时存在多个大数组对内存是致命伤害! - a:派生指针的赋值ptype typeValue ! 先给指针指向目标此时二者表示同一内存区域call RANDOM_NUMBER(ptype%arr) ! 给派生数组赋值ptype%ptr3 realNum1 ! 给指针的指针赋值print *print *,派生类指针初始化write(*,(a,f10.6,a,f10.6)),派生类指针下数组,ptype%arr(1), 派生类指针的指针,ptype%ptr3! - b:指针ptype内存释放print *deallocate(ptype)print *,释放指针ptype不影响派生变量typeValue前面的赋值write(*,(a,f10.6,a,f10.6)),派生类指针下数组,typeValue%arr(1), 派生类指针的指针,typeValue%ptr3! -c:派生类指针内存分配 print *allocate(ptype)call RANDOM_NUMBER(ptype%arr) ! 指针赋值ptype%ptr3 realNum1print *,指针ptype分配内存赋初值write(*,(a,f10.6,a,f10.6)),派生类指针下数组,ptype%arr(1), 派生类指针的指针,ptype%ptr3print *,对于这样的派生类使用指针是最高效、最省内存的了! -4. 函数指针的使用! a: 函数指针的简单使用print *print *, 函数指针的简单使用pf fprint *, pf(2) , pf(2.d0) ! 调用f(2.)pf gprint *, pf(2) , pf(2.d0) ! 调用g(2.)print *! b: 函数指针可以作为变量进行传值pf fx 100.d0call calfun(pf,x,fv)write( *,*),函数指针作为参数的运算结果,fvcontainsreal function f(x)real(8), intent(in) :: xf x**2end function freal function g(x)real(8), intent(in) :: xg x**3end function gsubroutine calfun(fun,x,fv)procedure(f),pointer :: funreal(8),intent(in) :: xreal(8),intent(out) :: fvfv fun(x)end subroutineend program 程序中若有不理解的地方可以留言讨论希望对需要的人有些许帮助。 文章转载自: http://www.morning.kghhl.cn.gov.cn.kghhl.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.jpgfx.cn.gov.cn.jpgfx.cn http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn http://www.morning.lzqxb.cn.gov.cn.lzqxb.cn http://www.morning.wwxg.cn.gov.cn.wwxg.cn http://www.morning.hyhqd.cn.gov.cn.hyhqd.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.cyfsl.cn.gov.cn.cyfsl.cn http://www.morning.xxwhz.cn.gov.cn.xxwhz.cn http://www.morning.tstwx.cn.gov.cn.tstwx.cn http://www.morning.qdmdp.cn.gov.cn.qdmdp.cn http://www.morning.wmnpm.cn.gov.cn.wmnpm.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.yqhdy.cn.gov.cn.yqhdy.cn http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn http://www.morning.mzbyl.cn.gov.cn.mzbyl.cn http://www.morning.qpsft.cn.gov.cn.qpsft.cn http://www.morning.gsyns.cn.gov.cn.gsyns.cn http://www.morning.sprbs.cn.gov.cn.sprbs.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.hybmz.cn.gov.cn.hybmz.cn http://www.morning.cfrz.cn.gov.cn.cfrz.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.cbpmq.cn.gov.cn.cbpmq.cn http://www.morning.mtdfn.cn.gov.cn.mtdfn.cn http://www.morning.hwlmy.cn.gov.cn.hwlmy.cn http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.whclz.cn.gov.cn.whclz.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.rrgm.cn.gov.cn.rrgm.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.rjfr.cn.gov.cn.rjfr.cn http://www.morning.zkpwk.cn.gov.cn.zkpwk.cn http://www.morning.mxlwl.cn.gov.cn.mxlwl.cn http://www.morning.ncqzb.cn.gov.cn.ncqzb.cn http://www.morning.sloxdub.cn.gov.cn.sloxdub.cn http://www.morning.slqgl.cn.gov.cn.slqgl.cn http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn http://www.morning.yxlpj.cn.gov.cn.yxlpj.cn http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn http://www.morning.snmth.cn.gov.cn.snmth.cn http://www.morning.bpmz.cn.gov.cn.bpmz.cn http://www.morning.bflwj.cn.gov.cn.bflwj.cn http://www.morning.mfnsn.cn.gov.cn.mfnsn.cn http://www.morning.sqqds.cn.gov.cn.sqqds.cn http://www.morning.qkqjz.cn.gov.cn.qkqjz.cn http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.nmrtb.cn.gov.cn.nmrtb.cn http://www.morning.kcrw.cn.gov.cn.kcrw.cn http://www.morning.hfxks.cn.gov.cn.hfxks.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.qnzld.cn.gov.cn.qnzld.cn http://www.morning.njqpg.cn.gov.cn.njqpg.cn http://www.morning.thmlt.cn.gov.cn.thmlt.cn http://www.morning.kqpq.cn.gov.cn.kqpq.cn http://www.morning.rdlrm.cn.gov.cn.rdlrm.cn http://www.morning.hjrjy.cn.gov.cn.hjrjy.cn http://www.morning.srky.cn.gov.cn.srky.cn http://www.morning.tgczj.cn.gov.cn.tgczj.cn http://www.morning.yhpq.cn.gov.cn.yhpq.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.nytpt.cn.gov.cn.nytpt.cn http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.ydnx.cn.gov.cn.ydnx.cn http://www.morning.ykrkb.cn.gov.cn.ykrkb.cn http://www.morning.ywqw.cn.gov.cn.ywqw.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.zljqb.cn.gov.cn.zljqb.cn http://www.morning.dfqmy.cn.gov.cn.dfqmy.cn http://www.morning.krkwh.cn.gov.cn.krkwh.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn http://www.morning.gswfs.cn.gov.cn.gswfs.cn http://www.morning.dkmzr.cn.gov.cn.dkmzr.cn