《Fortran指针.ppt》由会员分享,可在线阅读,更多相关《Fortran指针.ppt(15页珍藏版)》请在三一文库上搜索。
1、第十章 指针,10.1 指针的定义与使用,实质:给一个变量起一个别名,一、 指针变量的定义格式,类型说明,它表示该指针所指的目标变量类型。 POINTER为指针定义的关键字。,类型说明, POINTER:指针变量名1, 指针变量名2, ,例如: INTEGER,POINTER : A1, A2,可以将类型说明与指针说明分开,例如: INTEGER A1,A2 POINTER A1,A2,指针变量与目标变量的类型应当严格一致,二、指针变量的使用,P192 例10.1 指针变量示例1 PROGRAM POINTER1 INTEGER, POINTER:P !定义指针变量P INTEGER, TAR
2、GET: X !定义整型变量X READ*, X P=X !使P指向X,这时两者实际上是同一个变量 PRINT*, “X=“, X PRINT*, “P=“, P END,输入3 输出结果为:X=3 P=3,格式:指针变量=目标变量或者另一指针变量。,P193 例10.2 指针变量示例2 INTEGER, POINTER:P1, P2, P3, P4 INTEGER,TARGET: X1, X2 INTEGER X, S1, S2, S3, S4, S5 READ*, X1, X2 X=X1*X2 P1=X1 P2=X2 P3=X1 ! 多个指针变量可以指向同一目标变量 P4=P1 ! P4指
3、向X1 S1=P1*P2 S2=P3*P2 S3=P1*X2 S4=P3*X2 S5=P4*X2 PRINT*, “X=“, X,PRINT*,“S1=“, S1 PRINT*,“S2=“, S2 PRINT*,“S3=“, S3 PRINT*,“S4=“, S4 PRINT*,“S5=“, S5 END 输入:3 4 输出:X=12 S1=12 S2=12 S3=12 S4=12 S5=12,10.2 动态变量,方法:先定义指针,再利用ALLOCATE(P)函数为其动态分配空间,其中P为指针变量。,释放存储单元函数:DEALLOCATE,动态分配存储单元函数:ALLOCATE,P195 例1
4、0.4 ALLOCATE和DEALLOCATE函数的用法: PROGRAM POINTER4 INTEGER,POINTER:P1,P2 !定义指针变量P1、P2 INTEGER S ALLOCATE(P1,P2) !用ALLOCATE函数为P1,P2分配空间 READ*,P1,P2 S=P1+P2 DEALLOCATE(P1,P2) !用DEALLOCATE函数释放空间 PRINT*,“S=“,S END 输入5 6 输出S=11,10.3 指针与数组,利用指针来指向一个数组,能动态地分配数组空间,给编程带来极大的方便。通过动态定义,可以根据当时使用空间的大小来生成空间,使数组大小满足要求。
5、,一、指针数组的定义,格式: 类型说明,DIMENSION(: :),POINTER:指针名,DIMENSION(: :): 数组的动态说明标识,不指定数组下标界限 “:” 个数=数组维数 POINTER:指针说明标识。,例: REAL, DIMENSION(:), POINTER : X !声明指向一维实型数组的指针X ALLOCATE(X(20) !为X数组分配20个单元的存储空间,P197 例10.5 输入任意两个数,将它们及四则运算结果存储起来后输出。,分析:可以利用指针,定义一个动态数组X,用来存放输入的数据和计算的结果,该数组的空间大小可以根据要存储的数据个数动态分配。,REAL,
6、 DIMENSION(:), POINTER:X READ*, A, B C=A+B; D=A-B; E=A*B IF(B .NE. 0)THEN F=A/B ELSE F=0 ENDIF ALLOCATE(X(6) X(1)=A; X(2)=B; X(3)=C X(4)=D; X(5)=E; X(6)=F WRITE(*, 100)X 100 FORMAT(1X, 3F8.2) DEALLOCATE(X) END,输入3 6,输出: 3.00 6.00 9.00 -3.00 18.00 0.50,10.4 指针与链表,在链式存储中,每一个结点除了存储自己的信息以外,还保留下一个值,用来访问下
7、一个变量,这个值称为指针,下面介绍如何使用链表。,一、结点的定义,最简单的结点是普通数组的元素,如有以下定义:INTEGER A(10) 则A(1)、A(2)、A(3)、A(4)等,可以看作结点。,复杂的结点包含多种类型的数据,一般定义为一个结构体。,下面是一个链表结点结构体的定义:,TYPE NODE INTEGER VALUE !数据本身 TYPE (NODE), POINTER : NEXT !指向下一个结点的指针NEXT END TYPE NODE,P198 例: TYPE STUDENTNODE CHARACTER (15) NAME INTEGER NUM LOGICAL SEX
8、CHARACTER (30) ADDRESS TYPE (STUDENTNODE), POINTER : NEXT END TYPE,二、链表的基本操作,链表的基本操作:建表、插入、删除、查找、更新、遍历等。,P198 例10.6 建立一个链表,并输出建表后的结果。,program ex_6 implicit none type : node integer : value type (node),pointer : next end type node !链表的建立,以0作为建表结束 type(node),pointer : current , L integer : num read(*,
9、*) num NULLIFY( L )!L指向一个空对象 allocate(current) current%value=num L=current,do while (num/=0) read(*,*) num if(num/=0) then allocate(current) current%value=num current%next=L L=current end if end do current=L !链表的输出过程 write(*,*) current%value current=current%next do while(associated(current) write(*,*)current%value current=current%next end do end program ex_6,Associated是fortran90提供的内部函数,其作用是判断参数是否是关联状态,也就是指针是否已经作为其他对象的别名。,注意:链表有一个表头和一个表尾,由于FORTRAN语言中指针实际上就是一个别名,不同于C语言中的指针(C中的指针代表内存地址),因此没有明确的空指针的概念,链表的访问方式只能从最后一个结点开始,到第一个结点,通过检查链表是否再被连接作为结束标识,例10.6所建链表过程如下图所示。,
链接地址:https://www.31doc.com/p-2976645.html