Fortran指针 - 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
指针可以指向:
- 动态分配的内存区域
- 数据对象与目标属性相同类型的指针
分配指针的空间
allocate语句可以分配指针对象空间。例如:
program pointerExample
implicit none
integer, pointer :: p1
allocate(p1)
p1 = 1
Print *, p1
p1 = p1 + 4
Print *, p1
end program pointerExample
当上述代码被编译和执行时,它产生了以下结果:
1
5
应该解除分配语句清空该分配的存储空间当它不再需要,并避免未使用的和不可用的存储器空间的积累。
目标和关联
目标是另一个正态变量,空间预留给它。目标变量必须与目标属性进行声明。
一个指针变量使用的关联操作符使目标变量相关联(=>)。
让我们重写前面的例子中,以说明这个概念:
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
指针可以是:
- 未定义的
- 关联的
- 未关联的
在上面的程序中,我们使用associated的指针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