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 代码的模型,此外,我正在使用英特尔编译器编译代码。
正如 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)在现代所说的那样,想要做那种事情的理由减少了(使用可分配数组是一件值得考虑的好事)。
总之,对于“利弊是什么?”:指针赋值和分配做完全不同的事情。选择合适的。