- Fortran 教程
- Fortran - 主页
- Fortran - 概述
- Fortran - 环境设置
- Fortran - 基本语法
- Fortran - 数据类型
- Fortran - 变量
- Fortran - 常量
- Fortran - 运算符
- 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
当不再需要已分配的存储空间时,应通过deallocate语句清空已分配的存储空间,避免累积未使用和无法使用的内存空间。
目标与关联
目标是另一个普通变量,为其留出空间。目标变量必须使用target属性进行声明。
您可以使用关联运算符 (=>) 将指针变量与目标变量关联起来。
让我们重写前面的例子来演示这个概念 -
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关联起来。Associated 函数测试指针的关联状态。
nullify语句取消指针与目标的关联。
Nullify 不会清空目标,因为可能有多个指针指向同一目标。然而,清空指针也意味着无效。
实施例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 0 0 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