欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fortran:指针

程序员文章站 2023-12-26 00:00:09
...
声明:本博文翻译自: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
相关标签: fortran

上一篇:

下一篇: