📅  最后修改于: 2020-11-04 06:18:29             🧑  作者: Mango
在大多数编程语言中,指针变量存储对象的内存地址。但是,在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
指针可以指向-
动态分配的内存区域。
与指针具有相同类型的数据对象,具有target属性。
使用allocate语句可以为指针对象分配空间。例如-
program pointerExample
implicit none
integer, pointer :: p1
allocate(p1)
p1 = 1
Print *, p1
p1 = p1 + 4
Print *, p1
end program pointerExample
编译并执行上述代码后,将产生以下结果-
1
5
当不再需要已分配的存储空间时,应通过deallocate语句清空它,并避免累积未使用和无法使用的存储空间。
目标是另一个普通变量,并为其留出了空间。必须使用target属性声明目标变量。
您可以使用关联运算符(=>)将指针变量与目标变量关联。
让我们重写前面的示例,以演示概念-
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关联。关联的函数测试指针的关联状态。
nullify语句将指针与目标解除关联。
Nullify不会清空目标,因为可能有多个指针指向同一目标。但是,清空指针也意味着无效。
以下示例演示了概念-
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
0
0
10
10
请注意,每次运行代码时,内存地址都会不同。
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