Fortran指针
在大多数编程语言,指针变量存储一个对象的存储器地址。然而,在Fortran中,指针是已经不仅仅是存储内存地址更多的功能的数据对象。它包含有关特定对象的详细信息,如型号,等级,程度和内存地址。
一个指针是通过分配或指针赋值的目标有关。
声明指针变量
指针变量声明的指针属性。
下面的例子显示指针变量的声明:
integer, pointer :: p1 ! pointer to integer real, pointer, dimension (:) :: pra ! pointer to 1-dim real array real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array
指针可以指向:
- 动态分配的内存区域
- 相同类型的指针的数据对象,与目标属性
分配空间的指针
该分配语句允许你为指针对象分配空间。例如:
program pointerExample implicit none integer, pointer :: p1 allocate(p1) p1 = 1 Print *, p1 p1 = p1 + 4 Print *, p1 end program pointerExample
当上述代码被编译和执行时,它产生了以下结果:
1 5
你应该DEALLOCATE语句清空分配的存储空间时,不再需要它,避免闲置,无法使用的内存空间积累。
目标和协会
一个目标是另一个普通变量,以预留空间它。目标变量必须与目标属性声明。
您指针变量使用关联运营商的目标变量关联(=>)。
让我们重写前面的例子中,以证明概念:
program pointerExample implicit none integer, pointer :: p1 integer, target :: t1 p1=>t1 p1 = 1 Print *, p1 Print *, t1 p1 = p1 + 4 Print *, p1 Print *, t1 t1 = 8 Print *, p1 Print *, t1 end program pointerExample
当上述代码被编译和执行时,它产生了以下结果:
1 1 5 5 8 8
一个指针可以是:
- 未定义
- 关联的
- 解除关联
另外,在上述程序中,我们已关联的指示器p1,与目标T1,使用=>运算符。相关的功能,测试指针的关联状态。
该废止声明的关联从一个目标的指针。
抵消不清空目标,因为可能存在一个以上的指针指向同一目标。然而,排空指针意味着无效也。
例1
下面的示例演示的概念:
program pointerExample implicit none integer, pointer :: p1 integer, target :: t1 integer, target :: t2 p1=>t1 p1 = 1 Print *, p1 Print *, t1 p1 = p1 + 4 Print *, p1 Print *, t1 t1 = 8 Print *, p1 Print *, t1 nullify(p1) Print *, t1 p1=>t2 Print *, associated(p1) Print*, associated(p1, t1) Print*, associated(p1, t2) !what is the value of p1 at present Print *, p1 Print *, t2 p1 = 10 Print *, p1 Print *, t2 end program pointerExample
当上述代码被编译和执行时,它产生了以下结果:
1 1 5 5 8 8 8 T F T 952754640 952754640 10 10
请注意,每次运行代码时,内存地址会有所不同。
例2
program pointerExample implicit none integer, pointer :: a, b integer, target :: t integer :: n t= 1 a=>t t = 2 b => t n = a + b Print *, a, b, t, n end program pointerExample
当上述代码被编译和执行时,它产生了以下结果:
2 2 2 4
更多建议: