×
Fortran教程Fortran语言环境设置Fortran基本语法Fortran数据类型Fortran变量Fortran常量Fortran运算符Fortran算术运算符Fortran关系运算符Fortran逻辑运算符Fortran运算符优先级Fortran选择决策Fortran if...then语句结构Fortran if...then...else 结构Fortran if...else if...else 语句Fortran嵌套if结构Fortran select case结构Fortran嵌套select case结构Fortran循环Fortran do循环结构Fortran do...while循环结构Fortran嵌套循环Fortran exit语句Fortran Cycle语句Fortran Stop语句Fortran数字Fortran字符Fortran字符串Fortran数组Fortran向量和矩阵乘法函数Fortran还原功能Fortran查询函数Fortran构造函数Fortran重塑函数Fortran操作函数Fortran位置函数Fortran动态数组Fortran导出数据类型Fortran指针Fortran基本输入输出Fortran文件输入输出Fortran过程Fortran模块Fortran内部函数Fortran数字精度Fortran编程风格Fortran调试程序

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

指针可以指向:

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

分配指针的空间

allocate语句可以分配指针对象空间。例如:

program pointerExample
implicit none

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

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

1
5

应该解除分配语句清空该分配的存储空间当它不再需要,并避免未使用的和不可用的存储器空间的积累。

目标和关联

目标是另一个正态变量,空间预留给它。目标变量必须与目标属性进行声明。

一个指针变量使用的关联操作符使目标变量相关联(=>)。

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

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的指针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

分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)