指针(大学fortran程序课件)

上传人:F****n 文档编号:88049667 上传时间:2019-04-17 格式:PPT 页数:53 大小:249KB
返回 下载 相关 举报
指针(大学fortran程序课件)_第1页
第1页 / 共53页
指针(大学fortran程序课件)_第2页
第2页 / 共53页
指针(大学fortran程序课件)_第3页
第3页 / 共53页
指针(大学fortran程序课件)_第4页
第4页 / 共53页
指针(大学fortran程序课件)_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《指针(大学fortran程序课件)》由会员分享,可在线阅读,更多相关《指针(大学fortran程序课件)(53页珍藏版)》请在金锄头文库上搜索。

1、第十章 指针,指针是现代程序设计语言中一个非常重要的概念,它使语言的功能大大加强。FORTRAN90以前的FORTRAN版本,没有指针这种数据类型,FORTRAN90对其作了重大改进,引入了指针的概念。但是值得注意的是,FORTRAN90的指针与C语言中的指针并不相同,因为它并不代表一个变量的地址,而是代表一个变量的别名,实质上它相当于C+里的引用,本章介绍指针的概念与应用。,10.1 指针的定义与使用,在前面内容中,变量的使用,都是按变量的名字即标识符直接进行的,并且每个变量的名字都是唯一的,是否可以给同一个变量一个不同的名字?FORTRAN90中的指针,正是用来给变量起别名,并且通过后面的

2、章节的学习,我们知道指针能给编程带来诸多的方便。,10.1.1 指针变量的定义格式,指针变量的定义格式为: 类型说明,POINTER:指针变量名1,指针变量名2, 其中: (1)类型说明可以是任何数据类型,如INTEGER、REAL等,它表示该指针所指的目标变量类型。 (2)POINTER为指针定义的关键字,:为作用域符。 (3)指针变量名为标识符,只要符合标示符的命名规则即可。例如 INTEGER,POINTER:A1,A2此语句定义了两个指针变量A1和A2,它们都指向整型变量。,可以将类型说明与指针说明分开,即先说明变量的类型,然后指定变量为指针。例如 INTEGER A1,A2 POIN

3、TER A1,A2 此语句同样定义了整型两个指针变量A1和A2。,10.1.2、指针变量的使用,下面通过一个具体的实例来说明指针变量的使用: 例10.1指针变量示例1 PROGRAM POINTER1 INTEGER,POINTER:P INTEGER,TARGET: X READ*,X P=X PRINT*,“X=“,X PRINT*,“P=“,P END 输入3,程序的输出结果为: X=3,P=3 此例中,先定义了一个指针变量P,然后定义了一个整型变量X,再通过P=X语句,使P指向X,这时两者实际上是同一个变量,就象一个人除了自己的名字外,还有外号一样。因此,无论输入的是什么整数,两者显示

4、的结果一样。 X和P的关系如图10.1所示 X 5 P 图10.1,下面再看一个例子 例10.2 PROGRAM POINTER3 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 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*,

5、“S4=“,S4 PRINT*,“S5=“,S5 END 输入:3 4后,输出结果为: X=12 S1=12 S2=12 S3=12 S4=12 S5=12,在该例中,定义了四个指针变量:P1,P2,P3,P4,通过P1=X1,使P1指向X1,P2=X2使P2指向X2,再通过P3=X1和P4=P1,使P3和P4都指向X1,因此,X、S1、S2、S3、S4、S5计算结果一样,实际上都是X1+X2。 下面用图表示X1、X2、P1、P2、P3、P4的关系如图10.2、10.3所示: X1,(1) 指针变量赋值格式为: 指针变量=目标变量或者另一指针变量。 (2) 多个指针变量可以指向同一目标变量,但

6、是,一个指针变量只能指向一个目标变量,不能同时指向多个目标变量。 (3) 指针变量与目标变量的类型应当严格一致,不存在所谓的兼容情况,即,整型指针变量所指的只能是整型变量,而不能是实型变量等。 (4) 指针变量的本质是所指变量的别名,两者在编译时会当作同一变量,指针变量的引用实际上是对目标变量的引用。,(5) 在程序中,指针变量通常有以下三种状态: 未定义状态,在程序开始时,所有的指针都处于这种状态。 空状态,此时指针还没有作为任何对象的别名。 在程序中,有时为了方便起见,可以让指针指向一个空对象。其语句为: NULLIFY(指针变量名)。 关联状态,此时,指针已经作为其他对象的别名。 值得注

7、意的是只有在第三种状态时,指针才能参与运算,否则,或者编译出错,或者非法操作。,10.2 动态变量,前面已介绍过,变量的本质是一个内存单元,该单元一般是在变量定义时,就已经分配的,以后在程序运行期间不再改变,但是通过指针,可以先得到变量名,然后再利用ALLOCATE(P)函数可以动态分配其空间,其中P为指针变量。下面通过一个具体实例,来了解其使用方法。,例10.3,PROGRAM POINTER3 INTEGER,POINTER:P ALLOCATE(P) P=4 PRINT*,“P=“,P END 输出结果为:P=4,在该例中,先定义了一个指针变量P,然后利用ALLOCATE(P)函数,为P

8、分配空间,再给P赋值。 必须注意的是:如果去掉ALLOCATE(P)语句,则该程序运行时会出现错误,因为指针在未指定目标时是虚的,不能引用。 一般而言,ALLOCATE函数总是与DEALLOCATE函数配套使用,因为用动态分配函数为指针分配存储单元时,容易产生指针悬挂问题。所谓指针悬挂问题是指:当一个对象被释放,而释放时没有直接涉及作为其别名的指针时,就产生指针悬挂,这时,指针所占据的内存单元始终得不到释放,使用DEALLOCATE函数就可释放存储单元。 注意,对于普通变量,由于其内存空间自动回收,不存在上述问题。,例10.4,ALLOCATE和DEALLOCATE函数的用法,程序如下: PR

9、OGRAM POINTER4 INTEGER,POINTER:P1,P2 INTEGER S ALLOCATE(P1,P2) READ*,P1,P2 S=P1+P2 DEALLOCATE(P1,P2) PRINT*,“S=“,S END 输入5 6 输出S=11,该程序中,先定义了两个指针变量P1、P2,然后用ALLOCATE函数为其分配空间,再通过键盘输入其值,运算完毕,用DEALLOCATE函数,释放其空间。 必须注意的是:DELLOCATE函数所释放的空间,一定得是不再使用的动态空间,空间一旦被释放,就不得再使用,否则将产生非法操作,如上面程序中,如果将DEALLOCATE(P1,P2)

10、语句提前,就会产生非法操作。 注意,即使用DEALLOCATE(P)函数,释放P所指的空间,也可能产生悬挂指针问题,下面我们看一个可能产生悬挂指针的例子。,REAL, POINTER : P1, P2 ALLOCATE( P1 ) P1 = 13 P2 = P1 这时,P1,P2指向同一个存储单元,如果程序中在P1使用完后,用DEALLOCATE(P1)语句,这时,P2指针就被悬挂起来。 注意,ALLOCATE和DEALLOCATE还有可选用说明符STAT: ALLOCATE(P,STAT=IERR) DEALLOCATE(P,STAT=IERR) 其中IERR用于标识内存分配、解除是否成功,

11、成功则IERR的值为0。,10.3 指针与数组,利用指针来指向一个数组,能动态地分配数组空间,给编程带来极大的方便,因为FORTRAN语言的特点是,如果要使用数组,则必须在可执行语句之前先定义它,而数组普通定义的方法是首先必须指定数组的维界,确定数组存储空间的大小,但在编写程序时,开始往往难以确定所用数组的大小,显然,所定义的数组空间的大小不能小于所需的空间,解决的办法是将数组定义得足够大,但这样浪费了内存空间,而通过动态定义,可以根据当时使用空间的大小来生成空间,使问题得到很好的解决。下面讨论指针与数组关系的建立、动态空间的生成等。,10.3.1 指针数组的定义,指针数组定义格式为: 类型说

12、明,DIMENSION(: :),POINTER:指针名 其中:类型说明可以为各种数据类型,如INTEGER、REAL等;DIMENSION(: :)是数组的动态说明标识,即不指定数组下标界限,“:”个数=数组维数。POINTER为指针说明标识。例如 REAL, DIMENSION(:), POINTER : X ALLOCATE(X(20),第一个语句声明了一个可以指向一维整型数组的指针X,第二个语句为该数组分配了20个单位的存储空间。 下面看一个例子 例10.5 输入任意两个数,将它们及四则运算结果存储起来后,输出。 分析:此例中,可以利用指针,定义一个动态数组X,用来存放输入的数据和计算

13、的结果,该数组的空间大小可以根据要存储的数据个数动态分配,程序如下:,REAL,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 指针与链表,指针用途之一是使得数据在

14、计算机中可以按链接方式存储,而链接存储中,最简单是链表。下面介绍关于链表的一些基本知识。 顺序存储和链接存储是数据的两种最基本的存储结构。在顺序存储中,每个存储结点只含有存储元素本身的信息,元素之间的逻辑关系是通过数组下标位置简单计算出来的。如在顺序表中,若一个元素存储在对应的数组中的下标位置为I,则它的前一个元素在对应的数组中的下标是I-1,它的后一个元素是数组中下标为I+1的元素。顺序存储最大的缺点是不利于数据的动态变化,如向顺序表中插入或删除一个元素时,需要大量移动数据,处理效率很低。在链式存储中,每一个结点除了存储自己的信息以外,还保留下一个值,用来访问下一个变量,这个值称为指针,下面

15、介绍如何使用链表。,10.4.1 结点的定义,结点是存放数据的基本单位,最简单的结点是普通数组的元素,如若有以下定义:INTEGER A(10) 则象A(1) 、A(2)、 A(3)、 A(4) 等,可以看作结点。 复杂的结点包含多种类型的数据,一般定义为一个结构体,下面定义一个链表结点的结构体:,TYPE NODE INTEGER VALUE TYPE (NODE), POINTER : NEXT END TYPE NODE 该结点包含两项,一项是数据本身,即INTEGER VALUE,另外一项是一个指向下一个结点的指针NEXT,通过TYPE (NODE), POINTER : NEXT语句

16、定义,该结点可以用图10.3表示:,TYPE NODE INTEGER VALUE TYPE (NODE), POINTER : NEXT END TYPE NODE 该结点包含两项,一项是数据本身,即INTEGER VALUE,另外一项是一个指向下一个结点的指针NEXT,通过TYPE (NODE), POINTER : NEXT语句定义,该结点可以用图10.3表示:,图10.3,NEXT,下面再看一个结构体定义的例子。 TYPE STUDENTNODE CHARACTER (15)NAME INTEGER NUM LOGICAL SEX CHARACTER (30)ADDRESS TYPE (STUDENTNODE),POINTER:NEXT END TYPE,图10.4 结点示意图,结点结构体表示如图10.4:,10.4.2 链表的基本操作,链表的基本操作包括建表、插入、删除、查找、更新、遍历等,这里介绍建表、遍历、插入、删除等操作,其余操作将在下一节综合实例里介绍。 1. 链表的建立 例10.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号