1.概述2.指针引用与赋值3.整型指针4.与指针相关的函数和语句5.指针数组6.动态链表7.习题十一第十一章指针与动态数据结构7《FORTRAN90程序设计》课多媒体课件11.1概述/概述静态数据结构:在编译时为其分配存储空间,大小不能改变。静态数据结构优点:分配算法简单,易于实现,使用方便。静态数据结构缺点:易浪费存储空间,易产生下标越界错误。动态数据结构:在运行时为其分配存储空间,大小可改变。动态数据结构优点:可节约存储空间,灵活,应用广。动态数据结构缺点:分配算法复杂,实现难度大。象链表、树结构、图结构等数据结构都适合用动态数据结构实现,指针是实现动态数据结构的有效手段。指针和动态数据结构广泛应用于软件设计,熟练掌握和灵活应用指针和动态数据结构求解问题,可使程序更加简洁、紧凑、高效。11.1概述第十一章指针与动态数据结构概述存储结构访问方式指针声明指针状态11.1概述/存储结构存储单元地址:存储单元在内存中的排列序号(编号)。存储分配:系统为变量、数组、结构体、指针分配连续存储单元,用于存储有关数据,其变量名、数组名、结构体名、指针名代表连续存储单元首地址。指针变量(指针):为其分配的存储单元用于保存其它变量、数组、结构体的地址。通过改变其所存储的地址内容实现动态数据结构。示例:INTEGER,TARGET::I=1255REAL::R=534.45CHARACTER*5::S='CHINA‘INTEGER::A(3)=(/35,45,55/)INTEGER,POINTER::PP=I11.1概述第十一章指针与动态数据结构概述存储结构访问方式指针声明指针状态11.1概述/访问方式11.1概述第十一章指针与动态数据结构直接访问:直接访问存储单元中的内容。如对普通变量、数组元素、结构体成员的访问,采用直接访问方式。如图11-2所示。间接访问:先从存储单元中得到被访问存储单元地址,然后通过该地址访问被访问存储单元中的内容。如对指针变量的访问,采用间接访问方式。如图11-3所示。指针变量存储单元中保存目标变量地址,通常用箭头表示。F90指针保存目标变量名称,将指针看成目标变量的别名。指针变量声明后,未分配存储空间,访问前需分配存储空间。(示例)I125125J3753*125I=125J=3*IPI125125J3753*1253*PI地址I=125P=IJ=3*I概述存储结构访问方式指针声明指针状态11.1概述/指针声明11.1概述第十一章指针与动态数据结构POINTER属性:通过POINTER属性声明指针变量。TARGET属性:通过TARGET属性声明指针可指的目标变量。一般格式:类型描述,POINTER[::]指针变量名{,指针变量名}或POINTER指针变量名{,指针变量名}例:REALQ1,Q2INTEGER,POINTER::P1,P2!声明指向整型变量的指针P1和P2POINTERQ1!声明指向实型变量的指针Q1POINTERIQ1,IQ2!声明指向整型变量的指针IQ1和IQ2概述存储结构访问方式指针声明指针状态11.1概述/指针状态11.1概述第十一章指针与动态数据结构指针有三种状态:未定义、空指针、被关联。未定义:程序在初始状态中未定义所有指针。空指针:指针已定义,但未成为目标变量别名。被关联:指针已定义,已成为目标变量别名。概述存储结构访问方式指针声明指针状态11.1概述/概述/动态数据结构示例静态数据结构:在编译时为其分配存储空间,大小不能改变。静态数据结构优点:分配算法简单,易于实现,使用方便。静态数据结构缺点:易浪费存储空间,易产生下标越界错误。动态数据结构:在运行时为其分配存储空间,大小可改变。动态数据结构优点:可节约存储空间,灵活,应用广。动态数据结构缺点:分配算法复杂,实现难度大。象链表、树结构、图结构等数据结构都适合用动态数据结构实现,指针是实现动态数据结构的有效手段。指针和动态数据结构广泛应用于软件设计,熟练掌握和灵活应用指针和动态数据结构求解问题,可使程序更加简洁、紧凑、高效。11.1概述第二章FORTRAN90开发环境a1a2an链表树结构图结构概述存储结构访问方式指针声明指针状态11.1概述/存储结构/示例存储单元地址:存储单元在内存中的排列序号(编号)。存储分配:系统为变量、数组、结构体、指针分配连续存储单元,用于存储有关数据,其变量名、数组名、结构体名、指针名代表连续存储单元首地址。指针变量(指针):为其分配的存储单元用于保存其它变量、数组、结构体的地址。通过改变其所存储的地址内容实现动态数据结构。示例:INTEGER,TARGET::I=1255REAL::R=534.45CHARACTER*5::S='CHINA‘INTEGER::A(3)=(/35,45,55/)INTEGER,POINTER::PP=I11.1概述第十一章指针与动态数据结构1255534.45CHINA3545551000······整型变量I,地址1000,4字节,值1255实型变量R,地址1004,4字节,值534.45字符型变量S,地址1008,5字节,值CHINA整型数组A,地址1013,12字节,值35、45、55指针变量P,地址1025,4字节,值为10000110001004100810131025n······图11-1变量、数组、指针以及与地址的关系概述存储结构访问方式指针声明指针状态11.1概述/访问方式/示例11.1概述第十一章指针与动态数据结构直接访问:直接访问存储单元中的内容。如对普通变量、数组元素、结构体成员的访问,采用直接访问方式。如图11-2所示。间接访问:先从存储单元中得到被访问存储单元地址,然后通过该地址访问被访问存储单元中的内容。如对指针变量的访问,采用间接访问方式。如图11-3所示。指针变量存储单元中保存目标变量地址,通常用箭头表示。F90指针保存目标变量名称,将指针看成目标变量的别名。指针变量声明后,未分配存储空间,访问前需分配存储空间。(示例)I125125J3753*125I=125J=3*IPI125125J3753*1253*PI地址I=125P=IJ=3*II25!例11.1使用指针实现两个整数交换INTEGER,TARGET::I,J!声明两个目标变量I和JINTEGER,POINTER::P1,P2,P3!声明三个指针变量P1、P2和P3I=25;J=35!给目标变量I和J直接赋值P1=I;P2=J!给指针分配指向I和J的存储空间PRINT*,'未交换数据:',P1,P2!通过指针变量间接输出I和J的值P3=P1;P1=P2;P2=P3!交换指针P1和P2指向的目标变量PRINT*,'已交换数据:',P1,P2!通过指针变量间接输出J和I的值ENDI25P1图11-4指针交换J35P2J35P2P1P3交换前交换后概述存储结构访问方式指针声明指针状态11.2指针引用和赋值/指针引用指针引用:引用指针所指目标变量。11.2指针引用和赋值第十一章指针与动态数据结构指针引用指针赋值结构体指针!例11.2INTEGER,TARGET::R=25INTEGER,POINTER::PP=RM=3*P-4PRINT*,P,MEND!结果:25,71!例11.3INTEGER,POINTER::P1,PINTEGER,TARGET::R=12P=RR=2*PPRINT*,P,REND!结果:24,24!例11.4INTEGER,TARGET::R=13INTEGER,POINTER::P1,P2P1=RP2=P1PRINT*,P1,P2,REND!结果:13,13,1311.2指针引用和赋值/指针赋值别名赋值:将目标变量名作为别名赋值给指针。数据赋值:将数据表达式值赋值给指针所指目标变量。一般格式:指针变量名=目标变量名指针变量名=表达式11.2指针引用和赋值第十一章指针与动态数据结构!例11.5INTEGR,TARGET::R1=25INTEGR,TARGET::R2=35INTEGER,POINTER::P1,P2P1=R1P2=R2P1=P2PRINT*,P1,P2END!结果:35,35P1P1R125R2P235R135R2P235指针引用指针赋值结构体指针11.2指针引用和赋值/结构体指针11.2指针引用和赋值第十一章指针与动态数据结构结构体指针:指向结构体的指针。指针可为结构体别名。例:TYPEdate_recordINTEGER(2)yearINTEGER(1)month,dayENDTYPEdate_recordTYPE(date_record),TARGET::dateTYPE(date_record),POINTER::PP=dateP.year=1995;P.month=12;P.day=25y=3+P.year;m=P.month-2;d=5+P.dayPRINT*,datePRINT*,PPRINT*,y,m,dEND!输出结果:!19951225!19951225!19981030YearMonthdayPdate19951225Pdate指针引用指针赋值结构体指针11.3整型指针/概述整型指针:地址按4字节整数对待的指针。整型指针可参与整数运算。整型指针组成:指针、基变量、目标对象。创建指针步骤:第一步:将一个指针基变量链接在一个整型指针上。POINTER(指针变量名,指针基变量名)第二步:将目标对象地址赋值给整型指针。整型指针名=LOC(目标对象名)整型指针名=MALLOC(整型表达式)标准函数LOC功能:获得目标对象起始内存地址。标准函数MALLOC功能:计算表达式值n,分配n个字节存储单元,获得存储单元起始地址。(示例)11.3整型指针第十一章指针与动态数据结构概述例11.6例11.711.3整型指针/例11.6分析下面程序REALA(10),B(5)POINTER(P,B)P=LOC(A)A(2)=125.0!等价于设置B(2)为125.0PRINT*,B(2)END通过POINTER语句,将指针基数组B与目标对象数组A建立联系,即指针P中存放的数组A的起始地址就是数组B的起始地址,所以运行程序后,输出B(2)的值为125.0。11.3整型指针第十一章指针与动态数据结构概述例11.6例11.711.3整型指针/例11.7分析下面程序INTEGER::A(5),BPOINTER(P,B)P=LOC(A)DOI=1,5B=I*10P=P+4ENDDOPRINT*,AEND!输出结果为:1020304050通过指针运算和指针基变量B的赋值操作,生成数组A的5个元素值。通过指针运算和指针基变量B的赋值操作,生成数组A的5个元素值。整型指针P增加4,相当于把数组的下标加1。11.3整型指针第十一章指针与动态数据结构AB12345PPPPP概述例11.6例11.711.3整型指针/概述/示例整型指针:地址按4字节整数对待的指针。整型指针可参与整数运算。整型指针组成:指针、基变量、目标对象。创建指针步骤:第一步:将一个指针基变量链接在一个整型指针上。POINTER(指针变量名,指针基变量名)第二步:将目标对象地址赋值给整型指针。整型指针名=LOC(目标对象名)整型指针名=MALLOC(整型表达式)标准函数LOC功能:获得目标对象起始内存地址。标准函数MALLOC功能:计算表达式值n,分配n个字节存储单元,获得存储单元起始地址。(示例)11.1概述第十一章指针与动态数据结构概述例11.6例11.7INTEGER::I,J=20POINTER(P,I)!建立指针基变量I和目标对象J的等价