第七章指针.ppt
上传人:天马****23 上传时间:2024-09-11 格式:PPT 页数:31 大小:309KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

第七章指针.ppt

第七章指针.ppt

预览

免费试读已结束,剩余 21 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

1.指针的基本概念实例:例7-1指针的声明、赋值、动态分配及运算PROGRAMPointersIMPLICITNONEINTEGER,POINTER::p,qINTEGER,TARGET::n=5INTEGER::mp=>nq=>pALLOCATE(p)!分配内存p=4m=p+q+nPRINT*,’p=’,p,’,q=’,q,’,m=’,mDEALLOCATE(p)!释放内存ENDPROGRAM基本概念说明:(1)指针。Fortran90的指针变量,是具有指针(POINTER)属性的变量。在程序中,p和q声明为整型指针变量,可以指向整型存储单元。(2)目标。为便于编译器优化,Fortran90规定:能被指针引用的变量必须具有目标(TARGET)属性。n是具有目标属性的整型变量,因此可以作为整型指针p或q引用的变量。(3)指针赋值。指针赋值操作符为“=>”。例如:p=>n,是指针赋值语句,将指针p与目标n相关联(称p指向n),p作为n的别名引用的是同一存储单元的内容;q=>p,同样是指针赋值,但意义不同:赋值号两边均为指针变量,在这种情况下,指针q间接地与指针p的目标n相关联,因此一个目标同时可以有多个关联指针;如p=4,表示将p关联的目标赋以整型数4。(4)指针关联。Fortran90指针有3种关联状态:关联(associated)、非关联(disassociated)和未定义(undefined)。声明时,为未定义;指针赋值或动态分配(ALLOCATE)时,为关联;运用NULLIFY函数或动态释放(DEALLOCATE)时,为非关联;ASSOCIATED函数用来检测指针是否关联。(5)动态分配。ALLOCATE语句用来为目标动态分配存储单元,并将指针与动态分配的存储单元目标相关联。ALLOCATE(p)为一整型目标分配空间,与指针p相关联。此时,新目标的内容还未定义,p以前的目标n不受影响。p=4,将新目标的内容设为整型数4。DEALLOCATE语句用来撤消指针关联,释放由ALLOCATE语句动态分配的存储单元。(6)指针表达式。Fortran90的指针实际上是对目标变量的引用,不具有地址概念。在表达式m=p+q+n中,p和q的目标值分别为4和5,n=5,所以表达式结果为14。Fortran90指针只是一种变量属性,不是一种真实的数据类型,因此不能直接创建指针数组。作为一种替代方式,可以定义包含指针的派生类型,然后创建该派生类型的数组,来间接实现指针数组的功能。在声明具有指针属性的数组时,须采取延迟形状数组形式。如:REAL,DIMENSION(100),POINTER::X!非法REAL,DIMENSION(:),POINTER::X!合法例7-2指针数组在下三角矩阵中的应用,解决交错数组的动态分配问题PROGRAMLowerTriangularIMPLICITNONETYPEROWREAL,DIMENSION(:),POINTER::R!声明具有指针属性的数组ENDTYPEINTEGER,PARAMETER::N=4TYPE(ROW),DIMENSION(N)::T!声明派生类型的数组INTEGERIDOI=1,NALLOCATE(T(I)%R(1:I))!为每行分配不同存储单元T(I)%R(1:I)=1!为下三角矩阵每行赋值ENDDODOI=1,NPRINT*,T(I)%R(:I)!输出下三角矩阵ENDDODOI=1,NDEALLOCATE(T(I)%R)!释放存储单元ENDDOENDPROGRAM输出结果:1.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000在程序中,先创建含有指针成员的派生类型,再创建该类型的数组,然后为数组的指针成员关联的目标动态分配内存,节省近一半的存储单元。Fortran90不允许函数返回值有ALLOCATABLE属性,但允许有POINTER属性。因此当需要函数返回一个可变大小的数组时,可以用指针数组代替动态数组作为函数的返回值,实例见例7-3。例7-3函数的返回值为指针数组PROGRAMSort!对任一大小的整型数组按升序排列IMPLICITNONEINTEGER,DIMENSION(10)::X=(/3,6,9,-1,56,4,6,0,0,8/)INTEGER,DIMENSION(:),POINTER::P!声明与X同维的指针数组P=>Vector(X)!指针指向函数Vector目标PRINT*,PDEALLOCATE(P)!间接释放为函数分配的空间CO