codecamp

Fortran指针

在大多数编程语言,指针变量存储一个对象的存储器地址。然而,在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

指针可以指向:

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

分配空间的指针

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

program pointerExample
implicit none

   integer, pointer :: p1
   allocate(p1)
   
   p1 = 1
   Print *, p1
   
   p1 = p1 + 4
   Print *, p1
   
end program pointerExample

当上述代码被编译和执行时,它产生了以下结果:

1
5

你应该DEALLOCATE语句清空分配的存储空间时,不再需要它,避免闲置,无法使用的内存空间积累。

目标和协会

一个目标是另一个普通变量,以预留空间它。目标变量必须与目标属性声明。

您指针变量使用关联运营商的目标变量关联(=>)。

让我们重写前面的例子中,以证明概念:

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,使用=>运算符。相关的功能,测试指针的关联状态。

废止声明的关联从一个目标的指针。

抵消不清空目标,因为可能存在一个以上的指针指向同一目标。然而,排空指针意味着无效也。

例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
952754640
952754640
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

Fortran的常量
Fortran的基本输入输出
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }