📜  Fortran-指针

📅  最后修改于: 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不会清空目标,因为可能有多个指针指向同一目标。但是,清空指针也意味着无效。

例子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
0
0
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