理解 Fortran 指针

She*_*284 1 fortran fortran77 fortran90 intel-fortran

在 Fortran 中,可以为指针分配内存,或者不能:

real(kind=jp), target :: bt(100,100)
real(kind=jp), pointer :: pt(:,:)
Run Code Online (Sandbox Code Playgroud)

但是你可以为指针分配内存pt

allocate(pt(100,100))
Run Code Online (Sandbox Code Playgroud)

我的问题是:利弊是什么?就我所见,为指针分配内存违背了指针的目的并占用了更多内存。当然,我对指针的了解是有限的,所以如果有人能向我解释这里发生了什么,我将不胜感激。

我正在使用混合 FORTRAN 77 和 Fortran 90 代码的模型,此外,我正在使用英特尔编译器编译代码。

fra*_*lus 5

正如 Vladimir F 在对另一个答案的评论中所说的那样,对于示例代码的作用很可能存在一些混淆。虽然不是所有关于指针的广泛答案(已经部分涵盖),但我将简要评论。

real(kind=jp), target :: bt(100,100)
real(kind=jp), pointer :: pt(:,:)
Run Code Online (Sandbox Code Playgroud)

指针pt此时未指向任何内容:它具有未定义的关联状态。您将两个对象声明在一起,一个带有target属性,一个带有pointer属性,并不表示什么。

pt与 target关联,bt需要分配指针:

pt => bt
Run Code Online (Sandbox Code Playgroud)

通过这种方式,人们可以继续bt通过指针做一些事情,pt而无需任何额外的内存分配(会有一些与指针变量相关的开销,但让我们忽略这一点)。

是的,也可以按照问题进行指针分配

allocate(pt(100,100))
Run Code Online (Sandbox Code Playgroud)

但这块新造的记忆与bt.

正如亚历山大·沃格特 (Alexander Vogt)在现代所说的那样,想要做那种事情的理由减少了(使用可分配数组是一件值得考虑的好事)。

总之,对于“利弊是什么?”:指针赋值和分配做完全不同的事情。选择合适的。