Fortran:指针

声明:本博文翻译自:https://www.tutorialspoint.com/fortran/fortran_pointers.htm

指针这一块知识比较繁杂,这里只做一个简单的介绍。而且在一般的fortran代码中,不适用指针也可以完成相应的工作。
在大多数编程语言中,指针变量存储对象的内存地址。然而,在Fortran语言中,指针是一种数据对象,它具有比存储内存地址更多的功能。它包含关于特定对象的更多信息,比如类型、级别、区段和内存地址。
指针通过分配或指针分配与目标相关联。

1. 声明指针变量
指针变量用指针属性进行声明
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

指针可以指向:
(1)动态分配的内存区域
(2)具有目标属性的与指针类型相同的数据对象。

2. 为指针配分内存
program pointerExample
  implicit none

  integer, pointer :: p1
  allocate(p1)

  p1 = 1
  Print *, p1

  p1 = p1 + 4
  Print *, p1
  deallocate(p1)
end program pointerExample
执行结果如下:
1
5
当分配的存储空间不再需要时,应该使用deallocate语句清空它,并避免积累未使用和不可用的内存空间。

3. 目标变量与指针关联
目标是另一个常规变量,为它留出空间。必须使用目标属性声明目标变量。并且目标变量要与指针变量的数据类型相同。
使用运算符=>将目标变量与指针变量相关联
示例代码如下:
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可以检测指针是否被关联。
函数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  !.. 此时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

猜你喜欢

转载自blog.csdn.net/chd_lkl/article/details/82181548