Fortran 指针

在大多数编程语言中,指针变量存储对象的内存地址。然而,在 Fortran 中,指针是一种数据对象,它的功能不仅仅是存储内存地址。它包含有关特定对象的更多信息,如类型、维度、范围和内存地址。

指针通过分配或指针赋值与目标相关联。

声明指针变量

指针变量是用指针属性声明的。

以下实例显示了指针变量的声明:

  1. integer, pointer :: p1 ! pointer to integer
  2. real, pointer, dimension (:) :: pra ! pointer to 1-dim real array
  3. real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array

指针能够:

  • 动态分配的内存区域。
  • 与指针类型相同的数据对象,具有 target 属性。

为指针分配空间

allocate 语句允许您为指针对象分配空间。例如:

  1. program pointerExample
  2. implicit none
  3. integer, pointer :: p1
  4. allocate(p1)
  5. p1 = 1
  6. Print *, p1
  7. p1 = p1 + 4
  8. Print *, p1
  9. end program pointerExample

结果为:

  1. 1
  2. 5
当不再需要分配的存储空间时,您应该通过解除分配语句将其清空,并避免累积未使用和不可用的内存空间。

目标与关联

目标是另一个普通变量,为它留出了空间。目标变量必须用 target 属性声明。

您可以使用关联运算符(=>)将指针变量与目标变量相关联。

让我们重写前面的例子:

  1. program pointerExample
  2. implicit none
  3. integer, pointer :: p1
  4. integer, target :: t1
  5. p1=>t1
  6. p1 = 1
  7. Print *, p1
  8. Print *, t1
  9. p1 = p1 + 4
  10. Print *, p1
  11. Print *, t1
  12. t1 = 8
  13. Print *, p1
  14. Print *, t1
  15. end program pointerExample

结果为:

  1. 1
  2. 1
  3. 5
  4. 5
  5. 8
  6. 8

指针可以是:

  • 未定义
  • 相关
  • 已解除关联

在上面的程序中,我们使用 => 运算符将指针 p1 与目标 t1 相关联。关联的函数测试指针的关联状态。

nullify 语句将指针与目标解除关联。

nullify 不会清空目标,因为可能有多个指针指向同一目标。然而,清空指针也意味着无效。

实例1
  1. program pointerExample
  2. implicit none
  3. integer, pointer :: p1
  4. integer, target :: t1
  5. integer, target :: t2
  6. p1=>t1
  7. p1 = 1
  8. Print *, p1
  9. Print *, t1
  10. p1 = p1 + 4
  11. Print *, p1
  12. Print *, t1
  13. t1 = 8
  14. Print *, p1
  15. Print *, t1
  16. nullify(p1)
  17. Print *, t1
  18. p1=>t2
  19. Print *, associated(p1)
  20. Print*, associated(p1, t1)
  21. Print*, associated(p1, t2)
  22. !what is the value of p1 at present
  23. Print *, p1
  24. Print *, t2
  25. p1 = 10
  26. Print *, p1
  27. Print *, t2

结果为:

  1. 1
  2. 1
  3. 5
  4. 5
  5. 8
  6. 8
  7. 8
  8. T
  9. F
  10. T
  11. 0
  12. 0
  13. 10
  14. 10

请注意,每次运行代码时,内存地址都会不同。

实例2
  1. program pointerExample
  2. implicit none
  3. integer, pointer :: a, b
  4. integer, target :: t
  5. integer :: n
  6. t = 1
  7. a => t
  8. t = 2
  9. b => t
  10. n = a + b
  11. Print *, a, b, t, n
  12. end program pointerExample

结果为:

  1. 2 2 2 4

分类导航